[英]Assembly mov instruction without suffix
我有以下来自反汇编程序的mov指令(不带后缀)。
mov %dx,(%eax)
指令后缀是什么? 首先,我认为目标寄存器确定了后缀,但是根据我正在阅读的书,我猜它是由“最小”寄存器确定的。 所以在这种情况下
movw %dx, (%eax)
因为%dx(16位字寄存器)是最小的寄存器。 我的推理正确吗? (有时CSAPP的书有些混乱,没有清楚地说明细节)。
目标不是您的示例中的寄存器,而是源是寄存器。 因此,操作数大小为16位,因此AT&T将使用movw
。
目标是存储器中的2个字节,由32位寻址模式选择。 mov
要求源和目标的宽度相同。 如果至少一个操作数是一个寄存器,则唯一确定操作数的大小。
您需要为mov $123, (%eax)
类的后缀,因为两个操作数都不是寄存器。
您关于“最小”的想法完全是虚假的。 movl %eax, (%bx)
为movl
因为寄存器操作数为32位,并且通过16位寻址模式选择4字节目标。
寻址模式下的一个或多个寄存器对操作数大小的影响为零。 地址大小和操作数大小是独立的,您可以覆盖其中一个,但不能覆盖另一个。 (这就是为什么操作数大小( 0x66
)和地址大小( 0x67
)有单独的机器代码前缀字节的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.