无后缀的汇编mov指令

Assembly mov instruction without suffix

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

mov %dx,(%eax)

指令后缀是什么?首先我认为目标寄存器决定了后缀,但是根据我正在阅读的书,我猜它是由 "smallest" 寄存器决定的。所以在这种情况下会是

movw %dx, (%eax)

因为 %dx(16 位字寄存器)是最小的。 我的推理正确吗? (有时CSAPP书有点混乱,没有详细解释清楚)。

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

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

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


你对 "smallest" 的看法完全是假的。 movl %eax, (%bx)movl,因为寄存器操作数是32位,而4字节的目标是通过16位寻址方式选择的。

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