【问题标题】:x86_64 - encoding a mov instructionx86_64 - 对 mov 指令进行编码
【发布时间】:2017-03-27 18:17:06
【问题描述】:

编码x86_64指令mov rcx,rdx(使用https://defuse.ca/online-x86-assembler.htm)输出48 89 D1

使用this reference 检查操作码显示该字节序列如何对指令进行编码。

但是,该表中的两行(操作码8B)与mov 指令非常相似,但操作数的顺序颠倒了。
事实上,我可以使用48 8b ca(通过反编译验证)对相同的指令进行编码。

为什么两个操作码都存在?它们的差异是否超出了我的计算能力?什么时候会选择一个而不是另一个?

【问题讨论】:

  • 它们的存在是为了让内存操作数既可以是源也可以是目标。如果两者都是寄存器,您将获得两种编码。选择哪个取决于汇编程序,有些甚至允许您指定(例如,.s 气体后缀)。

标签: assembly x86 x86-64 opcode mov


【解决方案1】:

一个 modr/m 字节最多只能编码一个内存操作数。因此,在源或目标中支持内存操作数的所有指令都被编码两次,一次是源可能是内存操作数,一次是目标可能是内存操作数。当然,这意味着您可以对两个操作数都是寄存器两次的助记符进行编码。

【讨论】:

  • 谢谢,这就解释了。汇编简单的 mov 指令(无内存访问)时,汇编程序倾向于使用第一种编码而不是第二种编码,这是有原因的吗?只是巧合吗?
  • @user1000039 取决于汇编程序。 IIRC Solaris as 支持后者。
  • 取决于汇编程序。使用宏,您可以随机选择以在输出中获得一些多态性。但我认为没有任何理由这样做。顺便提一句。这也适用于 add、or、adc、sbb 和、sub、xor、cmp、test、xchg。 (最后两个有点不同)
  • @sivizius 我依稀记得一些汇编程序以特定方式选择编码以将二进制文件标记为使用该汇编程序进行汇编。这允许作者证明二进制文件是组装的,例如带有未经许可用于商业用途的演示版。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2012-04-08
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多