我想问为什么我们处理R8到R15中的低字节,为什么我们不使用高字节?我们可以使用低字节但不高
答案 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
)中,而不是存储在指令编码中。)