代码之家  ›  专栏  ›  技术社区  ›  Gilgamesz

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

  •  -1
  • Gilgamesz  · 技术社区  · 8 年前

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

    1. 我需要使用32个寄存器作为通用寄存器。有可能吗。怎样
    2. 我听说x86-64处理器有更多的通用寄存器,但它们没有命名。只有16个命名寄存器。那么,这是真的吗?有可能使用它们吗?
    2 回复  |  直到 8 年前
        1
  •  10
  •   Jens Kirk Roybal    8 年前

    在任何给定的时间,您不能使用超过CPU提供的寄存器;但是,您可以对多个值一个接一个地重复使用同一个寄存器。这就叫 register allocation register spilling 其中值使用 rSP 堆栈指针寄存器。

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

        2
  •  4
  •   Jay    7 年前

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

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

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

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

    当安腾诞生时,VLIW体系结构已经不受欢迎,因此他们将其称为EPIC(显式并行指令计算),而不是VLIW,但它仍然是VLIW。安腾有128个通用寄存器,这是因为预期你(一个C或C++编译器)会调度大量的同时操作(语义上)。每个指令包都有3条指令(以及3条指令中每一条的谓词指示符)和一个指示符,如果下一个指令包预期同时(语义上)执行。它不必同时执行。您可以同时执行27条指令,但如果使用低端安腾,则可能一次执行3条,如果使用高端安腾,可能一次会执行9条,但在任何一个处理器上的结果都是一样的,只需要更长或更短的周期,直到执行下一条指令。

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

    如果你给出更多关于你想做什么的细节,你可能会得到更好的答案。如果您试图在x86_64上模拟具有32个寄存器的处理器,则不需要寄存器的1对1映射。您正在仿真的平台的ABI将告诉您统计上可能发生的情况,因为程序最有可能被使用,并且每个平台都有一个定义良好的(尽管每个CPU和操作系统不同)约定。此外,对于大多数这样的项目,请考虑使用C或C++。除了移植方面的困难外,将其全部写入汇编中不会有任何收获。