x64寄存器名称中的“ R”代表什么?


Answers:


32

这意味着注册,并且并非全部都是出于历史原因。

历史上的部分是英特尔习惯于使用8008(A到E加H和L)来枚举带有字母的寄存器。当时该方案已经足够了,因为微处理器的寄存器很少,而且不可能获得更多的寄存器,而且大多数设计都做到了。当时流行的观点是,将为新出现的CPU重新编写软件,因此在模型之间更改寄存器命名方案并不是什么大问题。没有人预见到8088在被并入IBM PC后会演变成一个“家族”,而向后兼容性的锁几乎迫使英特尔不得不在32位寄存器上采用像“ E”这样的方案来维护它。

非历史性的部分都是实用的。对通用寄存器使用字母限制为26个字符,如果您删除那些可能与专用寄存器名称(如程序计数器,标志或堆栈指针)混淆的字符,则可以减少26个字符。

我没有消息来源来证实这一点,但我怀疑选择R使用前缀,以及在64位CPU上通过R15引入R8表示向编号寄存器的过渡,这在32位和-大型结构在将近半个世纪以来都不是从8008衍生而来的。IBM在1960年代使用360做到了这一点,紧随其后的是PowerPC,DEC Alpha,MIPS,SPARC,ARM,英特尔的i860和i960以及许多其他被人们遗忘的东西。

您会注意到,如果现有的寄存器存在的话,它们会很好地适合R0到R7,如果对它们进行内部处理也不会令我感到惊讶。现有的长寄存器(RAX / EAX / AX / AL,RBX / EBX / BX / BL等)可能会停留在太阳烧掉之前。


1
有点滑稽,但我想我应该不会感到惊讶。谢谢。
马特

3
那是我能集结的所有戏剧。:-)
Blrfl 2012年

+1非常有趣的阅读。但是,如果仅将其总结为一行,那将是我给出的答案。如果将所有这些丰富而有趣的信息归纳为“历史原因”。
Mike Nakis 2012年

6
AMD 确实考虑过将低8位寄存器重命名或别名为r0- r7,或使用UAX代替r8等等。“弄清楚如何最好地命名寄存器实际上是进行寄存器扩展最困难的部分之一。” (有关其他一些完整的x86-64历史记录,请参见stackoverflow.com/a/35619528/224132。)此外,该顺序不是二进制编码中的RAX / RBX / ...,而是AX,CX,DX,BX
Peter Cordes

9

在较早的处理器中,并非所有寄存器都相等:

  • 芯片上没有足够的空间来为每个寄存器提供加法器单元。
  • 对于8位,没有足够的操作码可用于源和目标的所有可能组合。

因此,假设在涉及加法器时总是牵涉到一个特定的寄存器,这会使芯片的复杂性降低,操作码更短。

例如6510(在Commodore 64中使用)只能使用寄存器A进行添加,而索引使用X或Y进行。有INC X和INC Y指令,但没有INCA。

由于寄存器具有不同的用法,因此选择了助记符以反映其用法。例如6510中的A,X和Y(而不是A,B和C)。

选择8086中的名称也可以反映其用法。使用4个通用寄存器,将它们命名为AX,BX,CX和DX是合乎逻辑的。其他索引寄存器称为BP和SP(助记符:基本指针,堆栈指针)。

由于许多操作码已扩展为16位,因此存在一定的空间来指示使用了四分之一寄存器。但是,某些历史原因仍然适用,因为CX有点特殊:REP等8位操作码始终使用CX作为计数器。一个简单的助记符CX = Counter,有助于记住使用了哪个。

8086后继产品的操作码必须向后兼容,并且由于长度可变的操作码而变得一团糟。当32位总线变得更加普遍时,尝试使用具有固定操作码长度的处理器。这简化了CPU的解码部分,从而释放了可用于更多寄存器的空间。

遵循这种思路的处理器称为RISC处理器(精简指令集CPU),与CISC(复杂指令集CPU)形成对比。

更多的寄存器导致更少的溢出到内存。基本上,寄存器是可用的最快的高速缓存,因此即使在当今,增加寄存器的数量也是一个好主意。缺少专门指令的情况(希望超过)可以通过简单指令的快速处理来弥补。

固定长度的32位操作码具有足够的空间来包含源,第二个源,一个操作和一个目标。SPARC设法为源,第二个源和目标分别压缩5位,因此有32个寄存器同时可见。

32个寄存器太多了,无法使用字母,而且它们无论如何都是相等的,因此对它们进行编号是显而易见的选择。“ R”用于将它们与常量0..31区别开,“ R”是Register的简单助记符。因此:R0..R31。

多年来,奔腾及其后续产品一直保持向后兼容。但是,许多更成功的RISC思想也被纳入其中。通常,那些新的,类似于RISC的指令将比向后兼容的版本运行得更快。

英特尔还增加了寄存器的数量,以减少内存访问的数量。

显然,英特尔终于开始使用R表示法了。向后兼容性将确保AX,BX,...保持不变,但我敢打赌AX只是例如R0的同义词。


免责声明:以上是我对历史的看法。由于我不是亲眼目睹历史的早期部分,所以这是不完整的。但是,我希望它对某些人有用。


1
6500系列确实不需要专用指令来累加累加器,因为立即模式加1与INXor或2 INY占用相同的两个周期,尽管代码占用了一个额外的字节。我为该芯片编写了许多程序集,在实践中,这种增量在进行需要它的数学运算之外很少见。
Blrfl 2011年

@Blrfl你是对的:ADD 1可以正常工作,因此不需要专门的“增加A”。我也不记得也需要它。
Sjoerd 2012年

1
应当指出的是,不是Intel增加了x64中的寄存器数量并为其命名,而是AMD,因为x86的64位扩展是由AMD创建的。英特尔的64位设计是Itanium,尽管它确实在寄存器中放入了很多寄存器(128个通用整数,还有许多其他寄存器),但执行起来还不是很好。
8bittree

5

它只是意味着“注册”。由于历史原因。


如果当前指的是寄存器,那不是真的那么历史吗?我想说寄存器的其他名称(AX,EAX等)更多是出于历史原因。但是RAX中的“ R”实际上非常适用。
卡尔·G

1
(+1)模因:“如果您可以长解释,则可以简短解释。”
user7813604
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.