2012-11-11 50 views
0

我可以在装配mov eax, [ax]中进行此操作,还是必须指定尺寸mov eax, dword [ax]装配说明mov

+0

取决于汇编程序,那么,您正在使用哪个汇编程序? – harold

+0

使用Nasm,并在32位模式工作 –

回答

3

[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)。

不要害怕尝试这些东西......虽然它可能不是很清楚为什么NA​​SM被拒绝,如果NASM真的接受它,这并不意味着它会做你想要什么......

+0

所以洞问题是[ax]不是有效的16位寻址模式? –

+0

对。无论如何,这是“大部分”问题。 –

+0

我只是一直忘记什么是有效的16位寻址模式..哦,以及 – harold

3

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

mov eax, [eax] 

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

+0

。感谢您的知识,现在我也知道:) –