我的问题是:
指令MOV RBX,RCX由YASM + LINK编译+链接为: 48h 89h CBh
但在其他程序如notepad.exe(64位)中,相同的MOV RBX,RCX显示为: 48h 8Bh D9h 。
两个操作码都对吗?或者那边的任何错误?或者发生了什么? 谢谢阅读。谢谢你回答。
答案 0 :(得分:3)
两者都是正确的。
48h 89h CBh
对应REX.W + 89 /r
,即MOV r/m64,r64
48h 8Bh D9h
对应REX.W + 8B /r
,即MOV r64,r/m64
由于RBX
和RCX
是(64位)寄存器,它们与r64
和r/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
。