【发布时间】:2012-11-11 19:57:50
【问题描述】:
我可以在汇编中做到这一点mov eax, [ax] 还是必须指定大小mov eax, dword [ax]。
【问题讨论】:
-
取决于汇编程序,那么,您使用的是哪个汇编程序?
-
使用 Nasm,并在 32 位模式下工作
我可以在汇编中做到这一点mov eax, [ax] 还是必须指定大小mov eax, dword [ax]。
【问题讨论】:
[ax] 不是有效的 16 位寻址模式。将其更改为mov ebx, [bx] 即可。 ebx 决定了操作的大小,所以你不需要说dword。在 32 位模式下,[bx] 不太可能是“有用”地址,但它是“有效”代码。在 32 位模式下,mov al, [eax]、mov ax, [eax] 和 mov eax, [eax] 都有效,大小由目标寄存器的大小决定,但您可能想说“字节”、“字”或“ dword”为清楚起见。在这种(!)情况下,大小不必匹配。
FWIW,可以在 16 位代码中使用 32 位指令和 32 位寻址模式。整个地址需要在段限制内 - 通常为 64k - 但mov eax, [eax + ecx * 4] 是有效代码。 Nasm(或其他“称职的”汇编程序)将生成所需的“操作数大小覆盖前缀”和“地址大小覆盖前缀”(0x66 和 0x67)。
不要害怕尝试这些事情......虽然可能不清楚 Nasm 拒绝的原因,如果 Nasm 接受它并不意味着它会按照您的意愿行事......
【讨论】:
bx和bp(bp默认为ss:bp)和“index”寄存器是@987654334 @ 和 di。相当有限!在 32 位模式下,任何寄存器都可以是“base”,除esp 之外的任何寄存器都可以是“index”,并添加一个可选的“scale”(2、4 或 8)以乘以“index”。一旦我们从 32 位代码开始,我们就会忘记 16 位模式……很高兴!
不,这些操作数不匹配。在可以访问 EAX 的 32 位系统上,您还必须使用相同的地址大小。
mov eax, [eax]
会将 EAX 中的指针替换为它指向的值。
【讨论】: