我有来自反汇编程序的以下 mov 指令(没有后缀)。
mov %dx,(%eax)
指令后缀是什么?首先我认为目标寄存器决定了后缀,但是根据我正在阅读的书,我猜它是由“最小”寄存器决定的。所以在这种情况下
movw %dx, (%eax)
因为 %dx (16 位字寄存器)是最小的。我的推理正确吗?(有时 CSAPP 的书有点混乱,没有解释清楚细节)。
在您的示例中,目标不是寄存器,而是寄存器的源。因此操作数大小为 16 位,因此 AT&T 将使用movw
.
目标是内存中的 2 个字节,由 32 位寻址模式选择。 mov
要求 source 和 dest 的宽度相同。如果至少一个操作数是寄存器,则它唯一地确定操作数的大小。
您需要一个明确的后缀,mov $123, (%eax)
因为这两个操作数都不是寄存器。
您对“最小”的想法完全是虚假的。 movl %eax, (%bx)
是movl
因为寄存器操作数是 32 位的,而 4 字节的目标是通过 16 位寻址方式选择的。
寻址模式中的一个或多个寄存器对操作数大小的影响为零。地址大小和操作数大小是独立的,您可以覆盖其中一个,但不能覆盖另一个。0x66
(这就是为什么操作数大小( )和地址大小( )有单独的机器码前缀字节0x67
。