为何Intel x86手册用+rd而非+ro/+rq指代64位寄存器?
Intel x86手册寄存器编码疑问解析
关于PUSH r64指令描述的矛盾
你观察到的Intel手册中50+rd PUSH r64的描述,与表3-1里+rd指代32位寄存器、+ro指代64位寄存器的定义冲突,这确实是Intel手册的疏漏。类似的文档不一致问题在Intel早期x86-64手册版本中偶有出现,正确写法应为50+ro PUSH r64——64位寄存器的编码对应+ro规则。
你的两个困惑解答
1. Intel为何选用+ro而非+rq命名?
这属于厂商文档术语体系的差异:
- AMD用
+rq里的q直接对应“quadword(四字)”,契合64位宽度的通用术语。 - Intel的
+ro是自身文档的规则,o并非指代“octaword”(该术语在IA-64架构中指128位),而是特指x86-64模式下需配合REX前缀的64位通用寄存器编码规则。二者本质都是指代64位寄存器,只是厂商命名习惯不同。
2. 表3-1中32位寄存器部分有重复项,64位却没有?
+rd列里ESP、EBP、ESI、EDI的重复项,源于这些寄存器的编码存在跨模式的上下文依赖:
- 同一个编码值,在有无地址大小前缀的情况下会对应不同寄存器(比如编码
100在32位模式下是ESP,在16位模式下是SP),表3-1把这些不同模式下的映射全部列出,因此看起来是重复项。 - 而
+ro是x86-64模式专属的寄存器编码,必须配合REX前缀使用,每个编码唯一对应一个64位寄存器,不存在跨模式的映射冲突,因此没有重复项;对应位置标注N/A,是说明这些编码在64位模式下不会产生歧义映射。
内容的提问来源于stack exchange,提问作者user2468852
相关产品推荐
相关产品推荐

