装配说明mov

时间:2012-11-11 19:57:50

标签: assembly 32-bit mov

我可以在程序集mov eax, [ax]中执行此操作,还是必须指定大小mov eax, dword [ax]

2 个答案:

答案 0 :(得分:3)

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

mov eax, [eax]

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

答案 1 :(得分:3)

[ax]不是有效的16位寻址模式。将其更改为mov ebx, [bx],您就可以执行此操作。 ebx决定了操作的大小,因此您不需要说dword。在32位模式下,[bx]不太可能是"有用的"地址,但有效"有效"码。在32位模式下,mov al, [eax]mov ax, [eax]mov eax, [eax]都有效,大小由目标寄存器的大小决定,但您可能想说" byte"," word",或" dword"为清楚起见。在这个(!)的情况下,大小不必匹配。

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

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