0

我可以在汇编中这样做mov eax, [ax]还是必须指定尺寸mov eax, dword [ax]

4

2 回答 2

4

[ax]不是有效的 16 位寻址模式。将其更改为mov ebx, [bx],您可以做到。决定了操作的ebx大小,所以你不需要说dword. 在 32 位模式下,[bx]不太可能是“有用”的地址,但它是“有效”的代码。在 32 位模式下mov al, [eax]mov ax, [eax]mov eax, [eax]都是有效的,大小由目标寄存器的大小决定,但为了清楚起见,您可能想说“字节”、“字”或“双字”。在这种(!)情况下,大小不必匹配。

FWIW,可以在 16 位代码中使用 32 位指令和 32 位寻址模式。整个地址需要在段限制之内——通常是 64k——但是mov eax, [eax + ecx * 4]是有效的代码。Nasm(或其他“有能力的”汇编程序)将生成所需的“操作数大小覆盖前缀”和“地址大小覆盖前缀”(0x66 和 0x67)。

不要害怕尝试这些事情......虽然可能不清楚为什么 Nasm 拒绝,如果 Nasm 接受它并不意味着它会按照您的意愿行事......

于 2012-11-11T22:33:04.247 回答
2

不,这些操作数不匹配。在可以访问 EAX 的 32 位系统上,您还必须对地址使用相同的大小。

mov eax, [eax]

将用它指向的值替换 EAX 中的指针。

于 2012-11-11T20:44:17.897 回答