64位操作码

时间:2016-02-24 18:05:49

标签: assembly x86-64 opcode

我的问题是:

指令MOV RBX,RCX由YASM + LINK编译+链接为: 48h 89h CBh

但在其他程序如notepad.exe(64位)中,相同的MOV RBX,RCX显示为: 48h 8Bh D9h

两个操作码都对吗?或者那边的任何错误?或者发生了什么? 谢谢阅读。谢谢你回答。

1 个答案:

答案 0 :(得分:3)

两者都是正确的。

48h 89h CBh对应REX.W + 89 /r,即MOV r/m64,r64

48h 8Bh D9h对应REX.W + 8B /r,即MOV r64,r/m64

由于RBXRCX是(64位)寄存器,它们与r64r/m64都匹配。因此,可以使用这些编码中的任何一种。

  • REX.W表示设置W位(64位操作数大小覆盖)的REX前缀。 REX前缀从40h开始,W位为bit 3,因此40h + 8 == 48h。

  • 89h / 8Bh是操作码。

  • /r是您必须在名为"表2-1中查找的内容。在英特尔手册中使用ModR / M字节" 的16位寻址表。您已将r - 操作数置于顶部,r/m - 操作数位于左侧。因此,如果我们采用D9h,我们会看到r64应为RBX(表格不会列出RBX,但您已经获得了64 {位操作数大小覆盖),r/m64应为RCX