【问题标题】:What is the "X" part of the encoding of the r8-15 registers?r8-15 寄存器编码的“X”部分是什么?
【发布时间】:2021-01-25 17:34:05
【问题描述】:

this chart 上显示两个寄存器都有0b010 作为寄存器值:

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

add $1, %dl
add $1, %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 寄存器之一时,需要添加/添加一个额外字节以表示“这是寄存器 r10 而不是 rdx”是什么意思?

【问题讨论】:

    标签: assembly x86-64 machine-code


    【解决方案1】:

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

    这就是为什么在0.010 位模式中前导位与其他 3 位分开的原因;如果没有 REX 前缀,则默认为 0

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

    The REX prefix(您链接的同一页面上的另一部分)是 x86-64 如何通过前缀添加 8 个新寄存器以及选择 32 位或 64 位操作数大小,而无需修改其余指令编码. 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 名称更流行和普遍。 Why does Apple use R8l for the byte registers instead of R8b?

    【讨论】:

    • 你认为这是一个错字吗?另外,表中不应该是R10B而不是R10L吗? -- Error: bad register name %r8l'
    • R10B 和 R10L 是同一个意思。
    • @carl.hiass:不是错字,我在第二次查看该页面后更新了我的答案。该表中的 X 是占位符。
    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2017-05-25
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多