无后缀的汇编mov指令

Posted

技术标签:

【中文标题】无后缀的汇编mov指令【英文标题】:Assembly mov instruction without suffix 【发布时间】:2018-10-01 15:20:07 【问题描述】:

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

mov %dx,(%eax)

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

movw %dx, (%eax)

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

【问题讨论】:

一般情况下,如果要传输的值的大小可以从操作数中明确确定,则不需要后缀。如果无法确定(例如 mov $123,(someaddrmode),其中 $123 可以是 8bit、16bit、32bit 甚至 64bit),则必须添加后缀。 %dx 是一个 16 位寄存器,因此很明显您将传输 16 位。 知道了!谢谢。 【参考方案1】:

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

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

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


你对“最小”的想法是完全错误的。 movl %eax, (%bx)movl 因为寄存器操作数是 32 位,而 4 字节的目标是通过 16 位寻址方式选择的。

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

【讨论】:

正确。无论如何,其他任何事情都没有多大意义,IMO。 很好的解释。谢谢!

以上是关于无后缀的汇编mov指令的主要内容,如果未能解决你的问题,请参考以下文章

为 mov 指令选择后缀 (l-b-w)

汇编语言用啥软件写的?后缀名是啥?

ARM 汇编指令集 特点之一:条件执行后缀

Intel 汇编寄存器寻址方式简单规则

mov文件用啥软件打开 后缀名mov是啥格式文件

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )