我需要做的就是获取用户输入的字符串并将它们放在数组或结构中,但我不断收到错误
无效的有效地址
这是什么意思?
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
我完全错了吗?
答案 0 :(得分: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
,2
,4
和8
。< / p>
修改:正如Harold指出的那样,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
Wikipedia总结了所有64位,32位和16位寻址模式。