为什么在R8至R15中不使用高字节?

0 assembly x86-64 machine-code cpu-registers

我想问为什么我们要处理R8到R15中的低字节,为什么不使用高字节?我们可以使用低字节但不可以使用高字节

Pet*_*des 5

正如Jester在评论中已经说过的那样,在机器代码中没有多余的位来编码r8h和r8b。

在许多指令(例如mov)中,如果根本不使用REX前缀,则r / m8无法编码AH / BH / CH / DH。请参阅《英特尔insn参考手册》,并查找In 64-bit mode, r/m8 can not be encoded to access the following byte registers if a REX prefix is used: AH, BH, CH, DH.

mov  ah, r8b   ; not encodable
Run Code Online (Sandbox Code Playgroud)

yasm给出错误消息:

error: cannot use A/B/C/DH with instruction needing REX
Run Code Online (Sandbox Code Playgroud)

AMD认为,对8位指令访问所有16个寄存器的低字节,而不是对其他8组寄存器的低字节和高字节进行访问,这更有用(并且更正交,并且可以更硬件地在硬件中实现)。 。这不是您可以做到的xor ebx, [rsi + ah * 4]。相反,您必须movzx edx, ah/ xor ebx, [rsi + rdx*4]。因此,能够寻址高字节通常无济于事。

可能会的。能够寻址单个寄存器的全部4个甚至8个字节(与具有A / B / C / DH相比)更为有用。想要单独加载64b并解压缩字节的算法可以做到这一点,而不必多次移位16次。(例如,针对GF16数组执行基于LUT的Galois字段的纠错算法。)


因此,您的问题的主要答案是指令编码限制。如果不是那样的话,我们可以有字节可寻址的寄存器,那么很多加载/移位/屏蔽代码都可以做一些事情,例如movzx rdx, rax{5}获得rax的第5个字节。

我只是{}在此示例中发明了该语法。AVX512使用类似的{mask}语法,这不是我在说的。(AVX512将在矢量寄存器上带指令的字节掩码,但掩码将存储在64位寄存器(k0-k7)中,而不是指令编码中。)