Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 64位操作码_Assembly_X86 64_Opcode - Fatal编程技术网

Assembly 64位操作码

Assembly 64位操作码,assembly,x86-64,opcode,Assembly,X86 64,Opcode,我的问题是: 指令MOV RBX,RCX由YASM+链接编译并链接为: 48小时89小时CBh 但在其他程序中,如notepad.exe(64位),相同的MOV RBX,RCX显示为:48h 8Bh D9h 两个操作码都对吗?那边有什么错误吗?或者发生了什么? 谢谢你的阅读。谢谢你的回答。两者都是正确的 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位)寄存

我的问题是:

指令MOV RBX,RCX由YASM+链接编译并链接为: 48小时89小时CBh

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

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

两者都是正确的

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

  • 89h/8Bh是操作码

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


非常感谢你,迈克尔!!非常感谢你的解释。我想现在清楚了。