寄存器RSI,RDI,RSP和RBP的低字节是否可以在64位Intel处理器中直接寻址?

时间:2016-07-29 12:18:51

标签: assembly x86 x86-64 cpu-registers

在16位Intel处理器(8086等)中,寄存器SP,BP,SI,DI是16位寄存器,只能作为16位寄存器进行寻址。

32位处理器已将此寄存器扩展为32位(称为ESI,EDI,ESP,EBP),这些寄存器可用作16位寄存器,以实现向后兼容。

很少有资源声明这些寄存器现在可以在 64位Intel处理器中进行字节寻址(如SIL,DIL,SPL,BPL),并且资源不足。我很困惑!

这是一个附加功能以及添加R8-R15寄存器吗?

*字节寻址=寄存器的低字节。

1 个答案:

答案 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还允许我们解决上述寄存器的低字节

  • 不带REX前缀:像旧行为一样使用 B 集。 (没有REX前缀就无法访问新的寄存器R8-R15或其任何部分寄存器)
  • 带有REX前缀:现在的集合为 B'= {AL,CL,DL,BL,SPL,BPL,SIL,DIL,R8B-R15B}

也很容易理解为什么AH / BH / CH / DL无法与REX前缀一起使用,以及为什么不能将AH与BPL混合使用

所以问题的答案

  

这是R8-R15寄存器的附加功能吗?

。这是x86-64中的新功能