1. ホーム
  2. assembly

[解決済み] error: invalid effective address エラー:有効なアドレスがありません。

2022-02-15 18:48:11

質問

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 のような一般的なレジスターです。 eax , ebx , ecx または edx および scale は1、2、4、または8であり displacement は即値である。(これらの構成要素はそれぞれ任意である)。

bl は、インデックスに使用できるレジスタのひとつではありません。