【问题标题】:64 bits Operation Codes64 位操作码
【发布时间】:2016-02-24 18:05:48
【问题描述】:

我的问题是:

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

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

两个操作码都对吗?还是那边有什么错误?或者发生了什么? 谢谢阅读。感谢您的回答。

【问题讨论】:

    标签: assembly x86-64 opcode


    【解决方案1】:

    两者都是正确的。

    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 位是第 3 位,因此是 40h + 8 == 48h。

    • 89h/8Bh 是操作码。

    • /r 是您必须在英特尔手册中名为 “表 2-1. 16 位 ModR/M 字节的寻址形式”的表中查找的内容 .您的r-操作数位于顶部,r/m-操作数位于左侧。因此,如果我们采用D9h,我们会看到r64 应该是RBX(该表没有列出RBX,但您有一个64 位操作数大小覆盖),并且r/m64 应该是RCX

    【讨论】:

    • 非常感谢迈克尔!!非常感谢您的解释。我想现在很清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2017-07-26
    • 2015-02-16
    • 2013-03-24
    • 2013-08-29
    • 2011-07-07
    相关资源
    最近更新 更多