汇编mov指令不带后缀

时间:2018-10-01 15:20:08

标签: assembly x86 att

我有以下来自反汇编程序的mov指令(不带后缀)。

mov %dx,(%eax)

指令后缀是什么?首先,我认为目标寄存器确定了后缀,但是根据我正在阅读的书,我猜它是由“最小”寄存器确定的。因此在这种情况下

movw %dx, (%eax)

因为%dx(16位字寄存器)是最小的寄存器。 我的推理正确吗? (有时CSAPP的书有些混乱,没有清楚地说明细节。)

1 个答案:

答案 0 :(得分:2)

目标不是您的示例中的寄存器,而是源是寄存器。因此,操作数大小为16位,因此AT&T将使用movw

目标是内存中的2个字节,由32位寻址模式选择。 mov要求源和目标必须具有相同的宽度。如果至少一个操作数是一个寄存器,那么它将唯一地确定操作数的大小。

您需要为mov $123, (%eax)之类的内容添加一个明确的后缀,因为两个操作数都不是寄存器。


您关于“最小”的想法完全是虚假的。 movl %eax, (%bx)movl,因为寄存器操作数是32位,并且通过16位寻址模式选择4字节目标。

一个或多个处于寻址模式的寄存器对操作数大小的影响为零。地址大小和操作数大小是独立的,您可以覆盖其中一个,但不能覆盖另一个。 (这就是为什么操作数大小(0x66)和地址大小(0x67有单独的机器码前缀字节的原因。