无后缀的汇编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
)有单独的机器代码前缀字节。
我有以下来自反汇编程序的 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
)有单独的机器代码前缀字节。