0 assembly x86-64 machine-code cpu-registers
我想问为什么我们要处理R8到R15中的低字节,为什么不使用高字节?我们可以使用低字节但不可以使用高字节
正如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
)中,而不是指令编码中。)