2

我收到这种错误:

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

4 回答 4

3

计算地址时不能乘以变量。因此,您必须分别乘以 count * Patient 并稍后添加。

于 2013-09-04T05:48:05.573 回答
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]

lea 指令在现代 x86 上非常快。这可能会超过 imul 计算。我怀疑这对实际患者是否重要。

于 2013-09-04T07:10:03.010 回答
2

有趣的是,BurnzZ 有[record……在 Nasm 语法中,record一个普通的“立即”数字的地址,…… count * patient。变量的地址count,一个立即数,时间patient,另一个立即数...... Nasm 应该这样做!虽然这不是你想要的(我假设)。那些带有 Ed Beroset 名字的错误通常是“不寻常”的错误。我不知道你为什么在这里看到它。

你想要的(我假设)是[count]*patient- 这也行不通。但是当你这样做时mov eax, count,你就得到了变量的地址。要使用变量的“[contents]”,请使用mov eax, [count]. 虽然两者都会组装,但结果却大不相同!

于 2013-09-04T10:46:30.427 回答
2

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

于 2013-09-09T00:05:37.860 回答