x86-64处理器中没有足够的寄存器

时间:2016-02-27 13:24:13

标签: assembly x86-64

我们在x86-64处理器中有16个通用寄存器: RAX,RCX,RDX,RBX,RSP,RBP,RSI,RDI,R9-15。 x86-64处理器为我们提供了其他类型的寄存器。我的问题是:

  1. 我需要使用32个寄存器作为通用寄存器。可能吗。怎么样?
  2. 我听说x86-64处理器有更多通用寄存器,但它们没有命名。只有16个命名寄存器。那么,这是真的吗?是否可以使用它们?

2 个答案:

答案 0 :(得分:9)

在任何给定时间,您都不能使用比CPU提供的寄存器更多的寄存器;但是,您可以一个接一个地重复使用相同的寄存器来处理多个值。这称为register allocationregister spilling,其中值使用rSP堆栈指针寄存器在CPU寄存器和程序堆栈之间移动。

我假设你所谓的“未命名的寄存器”就是这样的溢出值。除了问题中列出的寄存器之外,更新的x86-64架构还提供MMXSSEAVX寄存器用于存储和一些操作,从而增加了寄存器的数量。但请注意不要丢弃非易失性寄存器,即检查机器和操作系统的calling convention

答案 1 :(得分:3)

我需要使用32个寄存器作为通用寄存器。可能吗。怎么样?

不,架构只定义了16,它们并不完全是通用的。某些指令仅适用于某些寄存器。你可能想要做的是在堆栈上的激活记录(数据结构)中定义你的状态(C局部变量去哪里),然后根据需要将这些值加载到寄存器中。我只能详细说明我是否理解你要做的事情,但我建议您查看操作系统的ABI(或某些操作系统,如果您没有使用操作系统)来查看在进行过程调用时,预计会发生寄存器。使用ABI指导您的寄存器使用也将帮助您使用更高级别的语言(如C或C ++)进行互操作。

我听说x86-64处理器有更多通用目的寄存器,但它们未命名。只有16个命名寄存器。那么,这是真的吗?是否可以使用它们?

其他通用寄存器用于无序执行系统,以调度指令流中即将到来的指令的执行,而不改变指令流的串行语义。此过程称为“寄存器重命名”。在某些芯片上,额外的寄存器根本不存在,因为这些芯片不执行无序执行。额外寄存器是CPU的实现细节,无法从x86_64指令集访问它们。其他架构通过提供VLIW(超长指令字)指令集避免了无序执行,该指令集使用编译器来调度指令而不是让硬件对它们进行调度。 Itanium就是这样一种架构。

当Itanium产生时,VLIW架构已经失宠,所以他们称之为EPIC(显式并行指令计算)而不是VLIW,但它仍然是VLIW。 Itanium有128个通用寄存器,这是因为预计您(C或C ++编译器)将安排大量的同时操作(语义上)。每个指令包具有3个指令(以及3个中的每一个的谓词指示符)以及指示是否期望(语义上)同时执行后续包的指示符。它不必同时执行。您可以链接27条指令同时执行,但如果您使用较低端的Itanium,它可能一次执行3条,如果您使用较高端的Itanium,则可以一次执行9条,但在任一处理器上的结果都是相同的,在执行以下指令之前,它只需要更长或更短的循环次数。

正如我所说,VLIW已经失宠了,因为C和C ++编译器可以通过以下方式排序指令:乱序执行系统可以确定指令流的数据依赖性并执行类似的调度工作,这也允许未来的处理器具有更宽的执行流水线阶段,而不会将寄存器计数限制在128.无论如何,这就是理论。

如果您提供有关您尝试做的更多详细信息,您可能会得到更好的答案。如果您试图在x86_64上模拟具有32个寄存器的处理器,那么您不需要1对1的寄存器映射。您正在仿效的平台的ABI将告诉您在统计上可能发生什么,因为最有可能使用过程,并且它们具有针对每个平台的明确定义(尽管每个CPU不同的操作系统)约定。另外,对于大多数此类项目,请考虑使用C或C ++。除了移植困难之外,你不会通过在装配中写下所有内容来获得任何东西。