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
,其中 base
和 index
是通用寄存器,如 eax
、ebx
、ecx
或 edx
,而 scale
是 1、2、4 或8,而displacement
是一个立即数。 (其中每个组件都是可选的。)
bl
不是可用于索引的寄存器之一。
我不知道为什么我的 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
,其中 base
和 index
是通用寄存器,如 eax
、ebx
、ecx
或 edx
,而 scale
是 1、2、4 或8,而displacement
是一个立即数。 (其中每个组件都是可选的。)
bl
不是可用于索引的寄存器之一。