英特尔SDM中ModR/M字节扩展寄存器R8-R15编码说明位置查询
x86-64 REX前缀与扩展寄存器映射说明
映射规则的SDM位置说明
你提到的映射规则在英特尔SDM中有明确的官方说明,对应位置为第2卷2.2.1节《REX Prefix》,该节配套的表2-4 REX Prefix Extended Register Encoding 就是你需要的显式映射对照表。
具体映射逻辑
你猜测的默认映射逻辑完全正确,R8~R15的编码规则如下:
- REX前缀的3个扩展位REX.R、REX.X、REX.B分别对应不同字段的最高有效位(第4位):
- REX.R:作为ModR/M字节中
reg字段的最高位 - REX.X:作为SIB字节中
index字段的最高位 - REX.B:作为ModR/M字节中
r/m字段、或操作码内置寄存器扩展位的最高位
- REX.R:作为ModR/M字节中
- 当对应REX扩展位置1时,原有3位字段值从000111依次对应R8R15,具体编码举例:
| 扩展位+3位字段编码 | 64位通用寄存器 | 32位通用寄存器 | 8位通用寄存器 |
|---|---|---|---|
| 1000 | R8 | R8D | R8B |
| 1001 | R9 | R9D | R9B |
| 1010 | R10 | R10D | R10B |
| 1011 | R11 | R11D | R11B |
| 1100 | R12 | R12D | R12B |
| 1101 | R13 | R13D | R13B |
| 1110 | R14 | R14D | R14B |
| 1111 | R15 | R15D | R15B |
快速验证方法
你可以通过GNU汇编工具链快速验证编码:
- 写单指令汇编文件,比如
mov r15, r10 - 用
as -o test.o test.s编译 - 用
objdump -d test.o查看机器码,就能直接看到对应的REX前缀、ModR/M字节的完整编码。
内容的提问来源于stack exchange,提问作者John Adam
相关产品推荐
相关产品推荐

