同一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
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位宽度
- 位7-4:
操作码字节
0x89
二进制:1000 1001
对应指令类型为MOV r/m64, r64,即把源寄存器的值复制到目标r/m寄存器(此处r/m为寄存器,而非内存地址)。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
- 位7-6(Mod):
编码2:4C 8B DC
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位操作
- 位7-4:
操作码字节
0x8B
二进制:1000 1011
对应指令类型为MOV r64, r/m64,即把源r/m寄存器的值复制到目标寄存器。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)
- 位7-6(Mod):
内容的提问来源于stack exchange,提问作者George Robinson
相关产品推荐
相关产品推荐

