英特尔在哪里记录了 ModR/M 字节中扩展寄存器 (R8-R15) 的编码?

Where has Intel documented the encoding of extended registers (R8-R15) in ModR/M byte?

我使用最新的官方“Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D and 4”作为参考来了解x86-64 ISA的机器级编码。

第 2 卷第 2.1.3 节中提供的 ModR/M 和 SIB 字节的文档给出了引用 8 位、16 位和 32 位寄存器的确切编码(表 2- 1、2-2 和 2-3)

但是,我找不到类似的 table 指定 REX 前缀中的 REX.X、REX.B、REX.R 字节如何与 ModR/M指定扩展寄存器。我专门为每个扩展寄存器寻找显式二进制编码。 据我所知,手册中 REX 前缀的文档仅指定 reg,r/m 字段在 MSB 中使用 REX 中的相应位扩展 1 位,但实际上并未给出显式映射对于位组合。

英特尔文档是否在 SDM 的任何位置明确说明了这些映射?或者只是假设 R8-R15 将遵循 obvious/natural 映射策略,REX.B/X/R 设置为 1,R8 编码为 000,R9 编码为 001 ... R15 编码为 111?

是的,如您所见,它遵循简单的二进制编号,使用 REX 位作为前导位,ModRM 位作为低 3 位来对寄存器编号进行编码。 8 = 1000 二进制,所以这是 R8 的编码。

https://wiki.osdev.org/X86-64_Instruction_Encoding#Encoding explains nicely, and https://wiki.osdev.org/X86-64_Instruction_Encoding#Registers 甚至有一个 table.


我在 Intel 的第 2 卷 PDF 中搜索了 r14(这对任何东西来说都不是“特殊”的,并且可能只会出现在 table 中)。第 2 卷中有 一些 table,但没有一个用于简单的 ModRM 本身。 (合并后的 PDF 太大,无法使用)。

Vol.2 does 清楚地描述了 REX 字段如何与 ModRM 字段结合以构成 4 位寄存器 numbers。 (例如,图 2-4 显示了 REX.B 和 ModRM.rm 以及 REX.R 和 ModRM.r 的串联)。我没有检查 vol.1 - 如果可以在那里找到关于寄存器 names(由汇编程序使用)匹配二进制寄存器编号的一些声明,我不会感到惊讶。名称仅对汇编程序有意义,在机器代码中没有意义,这在第 2 卷中有明确记录。


然而,信息第2卷:

确实有Table 3-1。与 +rb、+rw、+rd、+ro(续) 相关的寄存器代码用于没有 ModRM 的指令,其中操作码字节的低 3 位是寄存器编号的低 3 位。 (比如 push/pop r64 的短编码)。

Reg REX.B Reg field
R13B Yes 5
R14B Yes 6

依此类推,每个寄存器都有行,还有 3 组列用于 R14W、R14D、R14 的字、双字和四字大小。因此,如果您对二进制数映射到寄存器名称这一事实有疑问,table 可以清楚地说明这一点。 (假设这里的寄存器编号与其他情况下的工作方式不同,那就太疯狂了。)

还有一字节操作码的操作码映射,其中 push rSI/r14 共享一个条目 (0x58),与 xchg-with-(e)ax 相同,mov-immediate 到 byte-reg,pop, mov-immediate 到 word/dword/qword-reg,并在 2 字节操作码映射中 bswap。同样,如果这些寄存器编号的工作方式与其他地方的寄存器编号不同,那就太疯狂了。

有满tableTable2-8。 VEX.vvvv 以 xmm/ymm0..15 和 RAX/EAX .. R15/R15D 注册名称映射 。 (VEX.vvvv 可以为 BMI 指令编码整数寄存器,如 andn,是的,它们仅针对双字或四字记录,不能覆盖为带有 66 前缀的字操作数大小。)

Table 2-13。 SIB 字节 的 32 位 VSIB 寻址形式也相关,显示像 ESI/R14D 这样的列。 (在 64 位模式下,您通常不会将 67 地址大小前缀与 vpgatherdd 或其他任何内容一起使用,但您可以。64 位地址大小没有单独的 table .) table 没有明确提到 如何 VEX.B 在两个寄存器之间选择给定的位值 2:0,但这应该是显然来自其他案例。