You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一x86(64)指令的不同编码:mov r11,rsp的差异与opcode拆解

mov r11, rsp两种编码的行为与性能差异

行为差异

这两个编码的功能完全一致,最终都是把rsp的64位值复制到r11寄存器中——它们只是同一条指令的两种不同编码形式,没有任何功能上的区别。

性能差异

在现代x86-64 CPU(如Intel Skylake及后续系列、AMD Zen系列)上,这两条指令的性能完全相同:

  • CPU会将它们翻译成相同数量的微操作,执行延迟、吞吐量没有区别
    只有在非常老旧的x86 CPU(如Pentium 4之前的型号)上,可能存在极其细微的译码效率差异,但在当前主流平台上可以完全忽略。
两种编码的位字段拆解

x86指令编码由前缀、操作码、ModRM字节等部分组成,以下是具体拆解:

编码1:49 89 E3

  1. REX前缀字节 0x49
    二进制:0100 1001
    REX前缀的位字段(从高位到位0):

    • 位7-4:0100 → 固定标识这是一个REX前缀
    • 位3(R):1 → 用于扩展后续ModRM字节的Reg字段
    • 位2(X):0 → 此指令无SIB字节,该字段无效
    • 位1(B):0 → 用于扩展后续ModRM字节的R/M字段
    • 位0(W):1 → 指定操作数为64位宽度
  2. 操作码字节 0x89
    二进制:1000 1001
    对应指令类型为 MOV r/m64, r64,即把源寄存器的值复制到目标r/m寄存器(此处r/m为寄存器,而非内存地址)。

  3. ModRM字节 0xE3
    二进制:1110 0011
    ModRM字节的位字段:

    • 位7-6(Mod):11 → 表示R/M字段指向一个寄存器
    • 位5-3(Reg):001 → 结合REX.R=1,组成4位寄存器编号,对应源寄存器rsp
    • 位2-0(R/M):011 → 结合REX.B=0,组成4位寄存器编号,对应目标寄存器r11

编码2:4C 8B DC

  1. REX前缀字节 0x4C
    二进制:0100 1100
    位字段:

    • 位7-4:0100 → REX前缀标识
    • 位3(R):1 → 扩展ModRM的Reg字段
    • 位2(X):1 → 无SIB字节,该字段无效
    • 位1(B):0 → 扩展ModRM的R/M字段
    • 位0(W):0 → 注:在64位模式下,访问r8-r15寄存器需REX前缀,此处虽W=0,但因操作对象是64位寄存器,实际效果等价于64位操作
  2. 操作码字节 0x8B
    二进制:1000 1011
    对应指令类型为 MOV r64, r/m64,即把源r/m寄存器的值复制到目标寄存器。

  3. ModRM字节 0xDC
    二进制:1101 1100
    ModRM字节的位字段:

    • 位7-6(Mod):11 → 寄存器到寄存器操作
    • 位5-3(Reg):011 → 结合REX.R=1,组成4位编号1011,对应目标寄存器r11
    • 位2-0(R/M):100 → 直接对应源寄存器rsp(当Mod=11时,R/M=100固定指向rsp)

内容的提问来源于stack exchange,提问作者George Robinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:49:50