3

ユーザーが入力した文字列を取得して配列または構造内に配置するだけですが、エラーが発生し続けます

無効な実効アドレス

これは何を意味するのでしょうか?

コード

section .data
  fName db 'Enter your first name: '
  fNameLen equ $-fName
  lName db 'Enter your last name: '
  lNameLen equ $-lName

  numberOfStruct equ 50
  structSize equ 25
  firstName equ 0
  lastName equ 10


section .bss
  person resb numberOfStruct*structSize

section .text
  global _start

_start:
  mov esi, 0
  input_start:
    mov eax, 4
    mov ebx, 1
    mov ecx, fName
    mov edx, fNameLen
    int 80h

    mov eax, 3
    mov ebx, 0
    lea ecx, [person+structSize*esi+firstName] ;This is where the error appears
    mov edx, 15
    int 80h

    mov eax, 4
    mov ebx, 1
    mov ecx, lName
    mov edx, lNameLen
    int 80h

    mov eax, 3
    mov ebx, 0
    lea ecx, [person+structSize*esi+lastName] ;This is where the error appears
    mov edx, 10
    int 80h

    inc esi

    cmp esi,10
    jl input_start

    exit:
    mov eax, 1
    mov ebx, 0
    int 80h

私はそれを完全に間違っていましたか?

4

1 に答える 1

5

編集:問題の変更に一致するようにコードを追加し、回答を編集しました。

lea ecx, [person+structSize*esi+firstName] ; this is where the error appears

lea ecx, [person+structSize*esi+lastName]   ; this is where the error appears

これらは両方とも同じエラーがあります。で乗算することはできません。25有効なスケーリング係数は、、、1およびです。248

編集:ハロルドが指摘したimulように、アドレスを計算する最も簡単な方法は次のとおりです。

 imul ecx,esi,25                    ; ecx == 25*esi
 lea ecx,[ecx+person+firstName]     ; ecx == 25*esi + person + firstName

3を使用してアドレスを計算することもできますlea

 lea ecx,[8*esi]                    ; ecx == 8*esi
 lea ecx,[ecx+2*ecx]                ; ecx == 24*esi
 lea ecx,[ecx+esi+person+firstName] ; ecx == 25*esi + person + firstName

ウィキペディアには、64ビット、32ビット、および16ビットのすべてのアドレッシングモードの便利な要約があります。

于 2012-09-18T18:15:05.287 に答える