在16位Intel处理器(8086等)中,寄存器SP,BP,SI,DI是16位寄存器,只能作为16位寄存器进行寻址。
32位处理器已将此寄存器扩展为32位(称为ESI,EDI,ESP,EBP),这些寄存器可用作16位寄存器,以实现向后兼容。
很少有资源声明这些寄存器现在可以在 64位Intel处理器中进行字节寻址(如SIL,DIL,SPL,BPL),并且资源不足。我很困惑!
这是一个附加功能以及添加R8-R15寄存器吗?
*字节寻址=寄存器的低字节。
答案 0 :(得分:1)
在x86寄存器中,3位编码,因此您可以为每个操作数在 8个寄存器中进行选择。 16位和32位寄存器的顺序是
E = {(E)AX,(E)CX,(E)DX,(E)BX,(E)SP,(E)BP,(E)SI,(E)DI} < / strong>
但是,对于8位寄存器,选择的寄存器集是
B = {AL,CL,DL,BL,AH,CH,DH,BH}
如您所见,它们权衡了解决SP,BP,SI,DI低字节的能力,这些能力在当时被认为不太有用(严重的是,为什么要SP或BP的低字节?),将它们替换为AX,BX,CX,DX的高字节,这也有助于直接将8080程序集转换为8086,而无需任何重写。有关更多说明,请参见Why are first four x86 GPRs named in such unintuitive order?
随着SIB byte的出现,在32位模式中引入了更多的寻址模式。这样就可以释放EBP寄存器以供一般使用,因此BP的低字节可能有一些有用的用途,但是Intel并未更改编码方案以简化解码器并实现向后兼容性
但是,当AMD将ISA扩展到64位时,它们进行了许多重大更改。使用REX prefix可以寻址更多的寄存器,因此现在我们有了8个寄存器。 AMD还允许我们解决上述寄存器的低字节
也很容易理解为什么AH / BH / CH / DL无法与REX前缀一起使用,以及为什么不能将AH与BPL混合使用
所以问题的答案
这是R8-R15寄存器的附加功能吗?
是是。这是x86-64中的新功能