错误:无效的有效地址

时间:2016-06-12 04:16:38

标签: assembly nasm

我不知道为什么我的NASM汇编程序一直给我错误,我的代码中有一个无效的有效地址。问题在于以下代码:mov eax, dword [lst + (bl * DOUBLE_WORD)]。我只是尝试将常量和8位BL寄存器中存储的内容添加到lst表示的地址值中。我不被允许这样做吗?好吧,在我读的书中,这正是作者的做法。

; ************************************************************************
; Assembler: NASM
;
; This program sums the values of all elements of a double word array.
;
; ************************************************************************

section .data
    EXIT_SUCCESS equ 0            ; The exit status code for success
    SYS_EXIT     equ 0x3C         ; The value for the exit system call
    DOUBLE_WORD  equ 4            ; A double word is 4 bytes

    lst          dd  10, 20, 2, 1 ; A 4-element array
    size         db  4            ; The size of the array
    sum          dd  0            ; This is where we're going to store the sum

section .text
global _start
_start:
    nop
    mov    bl, 0 ; The index to keep track of the element we're working with
_loop:
    ; error: invalid effective address
    mov    eax, dword [lst + (bl * DOUBLE_WORD)]
    add    dword [sum], eax
    inc    bl
    cmp    bl, byte [size] ; Compare the index to the size
    jne    _loop           ; If the index value is not equal to the size,
                           ; keep looping

    ; x/dw &sum

    ; exit
    mov    rax, SYS_EXIT
    mov    rdi, EXIT_SUCCESS
    syscall

; ************************************************************************

%if 0

Compile and run:

nasm -f elf64 -F dwarf -g -o demo.o demo.asm -l demo.lst && \
ld -g -o a.out demo.o && \
rm demo.o && \
./a.out

%endif

1 个答案:

答案 0 :(得分:4)

简短回答:将bl更改为ebx

答案很长:在x86中,您使用的寻址模式称为SIB(比例索引库),其中有效地址的格式为base + index * scale + displacement,其中baseindex是常规寄存器,如eaxebxecxedxscale为1,2,4或8,并且displacement是一个直接数字。 (这些组件中的每一个都是可选的。)

bl不是您可以用于索引的寄存器之一。