r8-15寄存器编码的"X"部分是什么?

What is the "X" part of the encoding of the r8-15 registers?

this chart上表明两个寄存器的寄存器值都为0b010

这里的 X 值是多少?在反汇编下面两条指令:

add , %dl
add , %r10b

我得到:

>>> x/3bt $pc
0x401000 <_start>:                  10000000    11000010    00000001
>>> x/4bt $pc+3
0x401003 <_start+3>:    01000001    10000000    11000010    00000001

所以,我猜 X 是前缀字节中的 LSB,因为 0100 是静态的,对吗? X 是什么意思,每当使用 r8-r15 寄存器中的一个时,额外的字节需要 added/prefixed 是什么意思,才能说“这是寄存器 r10 而不是 rdx”?

X 是您在页面顶部链接的 table 中的占位符。它适用于 any 机器代码中有寄存器号的时间。前导位来自 REX 前缀中的字段之一,具体取决于这是哪个字段。

这就是 0.010 位模式中前导位与其他 3 位分开的原因;没有 REX 前缀,它隐含地 0.

在你的例子中,它是 .B 位,因为它正在修改 add $imm8, r/m8 中 ModRM 的 r/m 字段。 (因为我们可以看到它是 REX 前缀的低位)。

The REX prefix(您链接的同一页面上的另一部分)是 x86-64 如何添加 8 个新寄存器,以及选择 32 位或 64 位 operand-size,通过前缀而不修改指令编码的其余部分。 16 位和 32 位 x86 机器代码当然使用 3 位字段作为寄存器编号。

REX 前缀可以为 add r8, [rcx + r9*8] 等指令提供第 4 个 reg-num 位,其中包括 3 个寄存器编号(MODRM.reg、MODRM.rm 或 SIB.base,和 SIB.index)。并为 64 位操作数大小设置了 .W 位。

选择 X 作为占位符有点令人困惑,因为其中一个 REX 字段被命名为 X(SIB.index). 但他们指的不是


另请注意,r10lr10b 是同一寄存器的备用名称。 AMD 最初在定义 AMD64 时使用 r8-15b(“字节”)。英特尔显然后来发明了 r8-15l(“低”)名称(与 AL/CL/DL/BL/SPL/... 相似),但 b 名称更受欢迎和广泛使用。