error: invalid effective address

error: invalid effective address

我不知道为什么我的 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

简答:将 bl 更改为 ebx

长答案:在 x86 中,您使用的寻址模式称为 SIB(标度索引基数),其中有效地址的形式为 base + index * scale + displacement,其中 baseindex 是通用寄存器,如 eaxebxecxedx,而 scale 是 1、2、4 或8,而displacement是一个立即数。 (其中每个组件都是可选的。)

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