我可以在汇编中这样做mov eax, [ax]
还是必须指定尺寸mov eax, dword [ax]
。
问问题
1831 次
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 回答