关于x86架构XOR指令操作码第二字节计算及\xc0基值的技术问询
x86架构XOR指令操作码的字节编码逻辑解释
你列出的这类寄存器自异或的指令及对应操作码:
xor eax, eax→\x31\xc0xor ecx, ecx→\x31\xc9xor edx, edx→\x31\xd2xor ebx, ebx→\x31\xdb
一、第二个字节按9递增的计算逻辑
这些指令属于x86的寄存器-寄存器寻址模式,第二个字节是ModR/M字节,它的二进制结构分为3部分:
- 高2位:
Mod字段,用于定义寻址类型 - 中间3位:
Reg/Opcode字段,指定源寄存器 - 低3位:
R/M字段,指定目标寄存器
对于寄存器之间的操作,Mod字段必须设为11(二进制),表示纯寄存器寻址,无内存参与。此时Reg/Opcode和R/M字段直接对应32位通用寄存器的编码:
- eax → 000
- ecx → 001
- edx → 010
- ebx → 011
因为指令里源和目标是同一个寄存器,所以Reg/Opcode和R/M的编码完全一致。计算ModR/M字节的数值时:
- 设寄存器编码为
n(eax是0,ecx是1,以此类推) - 中间3位的权重是
8(左移3位),低3位的权重是1 - 该寄存器对应的字段总贡献为
n*8 + n = n*9
所以当寄存器编码依次+1时,ModR/M字节的数值就会按9递增:
- eax(n=0):0*9=0 → 基值
0xc0+ 0 =0xc0 - ecx(n=1):1*9=9 → 基值
0xc0+ 9 =0xc9 - edx(n=2):2*9=18 → 基值
0xc0+ 18 =0xd2 - ebx(n=3):3*9=27 → 基值
0xc0+ 27 =0xdb
二、\xc0作为基值的原因
\xc0的二进制是11000000,对应ModR/M字节的两个关键部分:
- 高2位
11:这是寄存器-寄存器寻址要求的Mod字段固定值,换算成十六进制就是0xc0(11左移6位,即3*64=192) - 后6位
000000:表示Reg/Opcode和R/M字段都是000,对应eax寄存器
当指令是xor eax, eax时,源和目标都是eax,所以Reg/Opcode和R/M字段都为0,此时整个ModR/M字节就是0xc0,这就是这个系列操作码的基值。
内容的提问来源于stack exchange,提问作者rdre8
相关产品推荐
相关产品推荐

