程序集lea:无效的有效地址

时间:2013-09-04 05:46:16

标签: assembly x86 nasm

我遇到了这种错误:

  

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

4 个答案:

答案 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)

您需要在单独的寄存器中输入变量,然后将它们相乘。两个变量不能直接相乘。