什么是CPU寄存器?


27

这个问题已经困扰了我一段时间,今天我想我会谷歌搜索它。我已经阅读了一些有关它的内容,它看起来与我一直称为处理器缓存的内容非常相似。

两者之间有区别吗?或者当我认为它们相同时我是对的吗?寄存器实际上是否必须位于CPU内部才能正常工作?

根据维基百科,寄存器是CPU中的一个位置,可以在将其发送回RAM之前快速访问和修改内存。我是否理解这是错误的,还是缓存和寄存器实际上相同?


13
CPU寄存器是一个为您跟踪CPU的组织。NSA是CPU寄存器的示例。
2013年

3
CPU 1级高速缓存通常由与寄存器相同类型的硅材料制成。它不是那么快,因为它需要额外的查找才能将缓存的地址与缓存位置相关联。但是寄存器和缓存绝对是芯片上的不同地方。
Zan Lynx

3
@JimmyHoffa:恐怕您的评论会使OP感到非常混乱,从而损害计算机科学知识。
rwong

3
@rwong Nah我知道了,我认为这很有趣。:P
Jeroen

1
另一个区别是大小:寄存器文件很少会超过数百个字,而L1缓存很容易会达到64k。
SK-logic

Answers:


61

它们并不完全相同。寄存器是CPU实际使用的值所在的位置。CPU设计使得它仅在寄存器中时才能够实际修改或以其他方式作用。因此,寄存器可以发挥逻辑作用,而内存(包括高速缓存)只能保存CPU读取和写入的值。

想象一下一个木匠在工作。他手里有一些物品(寄存器),然后,在工作台(缓存)上非常接近他经常处理的事情,但此刻不使用,然后在车间(主存储器)中涉及了即将进行的项目,但还不够重要,无法在工作台上进行。

编辑:这是关于寄存器逻辑如何工作的简单解释。

假设我们有四个名为R1..R4的寄存器。如果您编译如下语句:

x = y + z * 3;

编译器将输出(在反汇编时)如下所示的机器代码:

LOAD  R1, ADDRESS_Z //move the value of Z into register 1
MUL   R1, 3         //multiply the value of register 1 by 3
LOAD  R2, ADDRESS_Y //move the value of Y into register 2
ADD   R1, R2        //adds the value in R2 to the value in R1
STORE R1, ADDRESS_X //move the value of register 1 into X

由于大多数现代CPU都具有32位或64位宽的寄存器,因此它们可以对最大可容纳的任何值进行数学运算。对于较小的值,它们不需要特殊的寄存器。他们只是使用特殊的ASM指令,告诉它仅使用寄存器的一部分。而且,就像只用两只手的木匠一样,寄存器只能一次保存少量数据,但是它们可以被重用,将活动数据传入和传出它们,这意味着“很多寄存器”不会最终被需要。(当然,有很多可用的方法确实允许编译器生成更快的代码,但这不是绝对必要的。)


26
还有镇上(磁盘)仓库中的更多东西(磁盘)以及他可以在联邦快递(网络)中找到的其他东西:-)
Dan Pichelman 2013年

2
在很大程度上取决于所讨论的系统架构。
世界工程师

5
@Binero在16位x86处理器中,您具有名为Ax,Bx等的寄存器。当他们转移到32位处理器时,他们将寄存器扩展到32位EAx,EBx,如果访问Ax,则会获得EAx的低16位。在64位模式下,他们将寄存器RAx命名为低32位为EAx,而低16位仍为Ax。查看这些图,看看如何到达AH之类的字节的其他部分,以获取16位Ax寄存器的高字节:en.wikipedia.org/wiki/X86#Structure
stonemetal

2
而且在现代CPU中,由于寄存器只是临时映射到Really Fast Memory的内核中存储区的临时映射,这种类型的故障也会改变,具体取决于指令流及其与预测指令流的接近程度。
Vatine

2
@MasonWheeler您的好选择。
Vatine

3

实际上,CPU术语中的寄存器很小,在微处理器(CPU)内部可用,这些寄存器具有特定的名称,大小和功能,因处理器而异,例如,如果采用8085的微处理器是一个8位的处理器,其中有8个位寄存器(A:累加器,B,C,D,E,H和L寄存器以及一个标志寄存器都是8位)。两个16位寄存器PC和SP都具有特殊功能,并且在汇编编程期间将功能显示在图中。很少有寄存器控制超出了编程人员的范围。

如果您使用其他处理器,则寄存器会有所不同,可以说8086是16位处理器,它具有AX,BX,CX和DX都是16位,PC,SP和标志寄存器。

正如您在问题中引用的那样,它们是为了加快程序执行速度并充当处理器缓存,但是现在处理器架构发生了变化,并且他们(英特尔)添加了大量内存来调用处理器缓存

但处理器(CPU)缓存和处理器(CPU)寄存器,某些特殊活动(例如内存指针,程序状态等)实际需要的寄存器之间略有不同。例如:PC:Program Counter,它在程序存储器中充当内存指针, SP:堆栈指针,在堆栈存储器中充当存储器指针。累加器是缓冲区和主寄存器,用于访问算术运算的ALU。

您可以查看Mason Wheeler的解释


1

我认为认为寄存器不是存储器是有帮助的,不应将其视为存储器。

想像起来更像OO-Register是一个类,不是从Memory派生的,而Memory是一个类也不是从Register派生的,但是Register类具有用于将其数据与Memory相互转换的方法(机器操作代码)。另一方面,内存对寄存器一无所知,因此无法对寄存器调用操作。结果,所有CPU操作都由经常访问内存的寄存器执行。

只写寄存器的情况并不少见-几乎不是存储器的属性。寄存器值也可以不写入而更改-再次,不是您期望的内存行为。


在内存映射的I / O中,“内存”的只写区域并不少见。
SK-logic

@ SK-logic-正确-但是问题的上下文清楚地询问了OP将内存视为您读取和写入的内容。无需
再让

0

@Mason Wheeler提供的答案是准确的,但我认为可以将您的问题放在另一个角度。从您的问题来看,在我看来,您需要完全理解高速缓存和寄存器之间的区别的概念是数据路径。正如Mason正确指出的那样,CPU的逻辑(即,其数据路径)的设计方式使得内存信息不能直接由CPU处理,这就是寄存器存在的原因。实际上,如果该指令没有先加载到正确的寄存器中(通常是一个名为IR的寄存器,即“指令寄存器”),则CPU甚至无法解码正在运行的程序的当前指令。

这与CPU的连接方式有关。内存和ALU之间没有物理路径;提供给ALU的所有数据都必须以某种方式在某个寄存器中进行缓冲。可能会有所不同,但是将内存直接连接到ALU所需的电路太复杂:通过寄存器文件调解内存和ALU之间的所有通信会更加容易和有效,如上述数据路径所确定的那样。 。实际上,即使给定指令将内存位置指定为操作数(一种寻址模式,称为直接寻址),也会将相应的数据单元加载到一个称为MBR的寄存器中(内存缓冲区寄存器,有时也称为MDR,内存数据缓冲区) )。

请注意,从CPU的角度来看,信息(数据或代码)是来自主内存还是高速缓存并不重要,但是后者要快得多。出于性能原因而存在高速缓存,由于CPU的设计(即由于数据路径)而存在寄存器。聪明的程序员(实际上是聪明的编译器)尝试最大程度地使用寄存器,以最大程度地减少内存访问(寄存器比高速缓存或内存快)。这是合理的,因为存储在寄存器中的信息倾向于多次使用,实际上,这是RISC原理的原理之一。

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.