【问题标题】:How CPU could have additional registers in 64bit mode?CPU 如何在 64 位模式下拥有额外的寄存器?
【发布时间】:2013-12-29 02:04:10
【问题描述】:

这是一个关于现代 CPU 架构的非常低级的问题。 我了解到我可以在 64 位模式下使用更多额外的寄存器。 比如ARM架构有r15-r31通用寄存器,对于Intel/AMD r8-r15通用寄存器。 SIMD 寄存器也会像 xmm8-xmm15(或 ymm8-ymm15)一样翻倍

有谁知道在 64 位模式下怎么可能?

我不期望像“他们只是建立了更多的寄存器”这样简单的答案 因为在 32 位模式下,我不能使用那个额外的寄存器。 即使是那些额外的寄存器也没有被现代编译器完全使用。

【问题讨论】:

  • ...它们不可用于 32 位模式。指令的编码在 64 位模式下是不同的,允许对更多的寄存器进行编码。将寄存器添加到 32 位模式会破坏机器代码的兼容性。
  • 有关“长”答案,请参阅stackoverflow.com/a/5556505/2864740 和链接/引用的资源。

标签: architecture cpu-registers


【解决方案1】:

(我对arm64不熟悉,所以我以X86-64为例。) 寄存器选择以二进制指令编码。 32位指令只能使用80386中的寄存​​器,不能使用超出这些的寄存器。而且,IA-32(x86-32)用3位来表示寄存器,而x86-64需要4位来表示所有寄存器,需要另外一位来访问额外的寄存器,而这个位在64 位指令中的 REX 字节。这意味着,为了使用额外的寄存器,需要 REX 字节,而 REX 是 64 位指令的一部分; 32 位指令中没有 REX 字节,因此您不能在 32 位中使用额外的 reg。

在 SIMD 指令中,您还需要扩展位来访问更多寄存器。


对于ARM64,我知道一点:它的寄存器文件和指令集是全新的,不是32位ARM的扩展(X86-64是X86-32的扩展)。 ARM64 处理器可以运行 32 位 ARM 遗留指令以实现兼容性,但这是处理器的工作,而不是架构 (ISA) 的工作。早期的 ARM64处理器可以运行两种指令集架构来支持旧软件,但未来可能会放弃对 32 位架构的支持,只剩下 64 位(ARM64)。

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2012-05-09
    • 2011-10-26
    • 2017-01-03
    • 2019-04-21
    • 1970-01-01
    • 2021-09-13
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多