x86中没有足够的寄存器
我们在x86-64处理器中有16个通用寄存器:RAX,RCX,RDX,RBX,RSP,RBP,RSI,RDI,R9-15。 x86-64处理器为我们提供了其他种类的寄存器。 我的问题是:
在任何时候,你不能使用比CPU提供更多的寄存器; 但是,您可以一个接一个地重复使用同一个寄存器来创建多个值。 这就是所谓的寄存器分配和寄存器溢出,其中值使用rSP堆栈指针寄存器在CPU寄存器和程序堆栈之间移动。
我假设你称之为“无名寄存器”是这样溢出的值。 除了问题中列出的寄存器之外,更新的x86-64体系结构还提供MMX,SSE,AVX寄存器用于存储和一些操作,从而增加寄存器的数量。 小心不要让垃圾邮件被垃圾回收,即检查你的机器和操作系统的调用约定。
我需要使用32个寄存器作为通用寄存器。 可能吗。 怎么样?
不,架构只定义了16个,它们不是完全通用的。 一些说明仅适用于某些寄存器。 你可能想要做的是在栈上的一个激活记录(数据结构)中定义你的状态(C局部变量去),然后根据需要将这些值加载到寄存器中。 我只能详细阐述一下,如果我明白你想要做什么,但我建议你看一下操作系统(或者某个操作系统,如果你不使用操作系统)的ABI来查看寄存器会发生什么情况一个程序调用被做出。 使用ABI指导您的注册使用情况还可以帮助您与更高级别的语言(如C或C ++)互操作。
我听说x86-64处理器有更通用的寄存器,但它们是未命名的。 只有16个命名寄存器。 那么,这是真的吗? 有可能使用它们吗?
其他通用寄存器用于无序执行系统,用于安排指令流中即将到来的指令的执行,而不改变指令流的串行语义。 这个过程被称为“寄存器重命名”。 在某些芯片上,额外的寄存器完全不存在,因为这些芯片不执行乱序执行。 额外的寄存器是CPU的实现细节,它们不能从x86_64指令集访问。 其他体系结构通过提供VLIW(超长指令字)指令集来避免无序执行,该指令集使用编译器调度指令而不是让硬件调度它们。 Itanium就是这样的架构。
当安腾产生时,VLIW架构已经不受欢迎,所以他们称之为EPIC(显式并行指令计算)而不是VLIW,但它仍然是VLIW。 Itanium具有128个通用寄存器,这是因为预计您(C或C ++编译器)会安排大量的同时操作(语义上)。 每个指令数据包有3条指令(以及3条指令中的每条指令)和一个指示器,指示下一个数据包是否被预期同时执行(语义)。 它不必同时执行。 您可以同时执行27条指令,但如果您使用较低端Itanium,则可能一次执行3条指令,如果您使用较高端Itanium,则一次执行3条指令,但结果在任一处理器上都是相同的,它只需要更长或更短的周期数,直到执行下一条指令。
正如我所说的,VLIW已经不受欢迎了,因为C和C ++编译器可以按照无序执行系统可以确定指令流的数据依赖性并执行类似的调度工作的顺序来排序指令,也允许未来的处理器拥有更广泛的执行流水线阶段,而不必将寄存器数量限制在128位。这就是理论。
如果你提供更多关于你想要做什么的细节,你可能会得到更好的答案。 如果您试图在x86_64上模拟32个寄存器的处理器,则不需要寄存器的1对1映射。 您正在模拟的平台的ABI将告诉您统计上可能发生的情况,因为最有可能使用的是程序,并且每个平台都有一个定义良好的(虽然每CPU不同的操作系统)约定。 另外,请考虑大多数此类项目的C或C ++。 除了难以移植之外,您不会通过汇编全部内容获得任何收益。
链接地址: http://www.djcxy.com/p/85917.html上一篇: There aren't enough registers in x86
下一篇: Error: bad register name `%rax' MinGW, Windows 7, x64 CPU, C++
