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