我遇到了这种错误:
beroset-p-637-无效的有效地址
以下是包含错误行的示例代码块:
mov eax, 3
mov ebx, 0
lea ecx, [record + count*patient + firstName] ;this one
int 80h
以下是上面代码块中的变量:
patient equ 37
firstName equ 0
count resb 1
record resb patient*5
计数变量不能用于与患者相乘吗?
我在x86 Ubuntu 13中使用NASM
答案 0 :(得分:3)
计算地址时,不能乘以变量。因此,您必须分别对*患者进行多次计数,并在以后添加。
答案 1 :(得分:2)
op真正需要做的事情:
mov eax, count
imul eax, patient
lea ecx, [eax + record+ firstName]
imul的原因是人们不能将寄存器乘以常数 在寻址操作中超过1,2,4,8。病人是一个真正奇怪的常数(37)。
你可以使用lea通过组合1,2,4,8的各种倍数来进行复数乘法。 注意到37 = 32 + 5,他可以做到以下几点:
mov eax, count
lea ebx, [eax*8] ; 8 * count
lea eax, [eax+4*eax] ; 5 * count
lea eax, [ebx*4+eax] ; 4*8*count +5*count
lea ecx, [eax + record+ firstName]
在现代x86上,lea指令非常快。这可能超过了imul计算。
我怀疑这对实际患者是否重要。
答案 2 :(得分:2)
有趣的是,BurnzZ得到了...... [record
...在Nasm语法中,record
的地址是一个简单的“直接”数字,...... count * patient
。变量count
的地址,即时,patient
,另一个立即......纳斯姆应该这样做!虽然这不是你想要的(我认为)。 Ed Beroset在其中的名字出现的错误通常是“不寻常”的错误。我不太清楚为什么你在这里看到它。
你想要的(我认为)是[count]*patient
- 这也行不通。但是当你mov eax, count
时,你就得到了变量的地址。要使用变量的“[contents]”,请使用mov eax, [count]
。虽然两者都会组装,但结果却截然不同!
答案 3 :(得分:2)
您需要在单独的寄存器中输入变量,然后将它们相乘。两个变量不能直接相乘。