为什么我们不在R8到R15中使用高字节?

时间:2015-10-10 13:14:07

标签: assembly x86-64 cpu-registers machine-code

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

1 个答案:

答案 0 :(得分:4)

正如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

yasm给出了错误消息:

error: cannot use A/B/C/DH with instruction needing REX

AMD认为它更有用(并且更正交,在HW中可能更清晰),可以访问8位指令的所有16个寄存器的低字节,而不是访问其他一些设置的低字节和高字节8个regs。这不像你可以做xor ebx, [rsi + ah * 4]。相反,您必须movzx edx, ah / xor ebx, [rsi + rdx*4]。因此,能够解决高字节通常不会有太大帮助。

这很可能。能够解决单个寄存器的所有4个,甚至所有8个字节(与具有A / B / C / DH相比)更有用。想要进行64b加载并分别解压缩字节的算法可以做到这一点,而不必多次移位16。 (例如,为GF16数组执行LUT-based Galois-field multiplies的纠错算法。)

所以您的问题的主要答案是指令编码限制。如果不是这样的话,我们可以使用字节寻址寄存器,所以很多加载/移位/掩码代码可以像movzx rdx, rax{5}这样来获取rax的第5个字节。

我刚刚为这个例子发明了{}语法。 AVX512使用类似的{mask}语法,这不是我所说的。 (AVX512将为向量寄存器的指令带来字节掩码,但掩码将存储在64位寄存器(k0-k7)中,而不是存储在指令编码中。)