我刚刚开始学习汇编(之前我曾与c++合作过。)
我想知道为什么我们除了使用内存之外还需要使用寄存器,为什么不使用内存呢?
我想最明显的原因是在寄存器中进行计算比在内存中进行计算要快得多。但这是唯一的原因吗?
答案 0 :(得分:9)
寄存器放在CPU内部,直接放在ALU上,因此信号几乎可以立即传播。它们也是最快的内存类型,但它们占用了大量空间,因此我们只能使用有限数量的内存。增加寄存器数量增加
阅读If registers are so blazingly fast, why don't we have more of them?
更常用的数据将放在缓存中以便更快地访问。在过去,缓存非常昂贵,因此它们是可选部件,可以单独购买并插入CPU外部的插槽。如今,他们经常和CPU一脉相承。高速缓存由SRAM构成,它比寄存器单元小,但可能慢几十倍或几百倍。
主存储器将由DRAM构成,每个单元只需要一个晶体管,但比寄存器慢几千倍,因此我们不能在高性能系统中只使用DRAM。然而,某些嵌入式系统确实使用register file,因此寄存器也是主存储器
答案 1 :(得分:4)
实际上,有一些微小的实现不会将寄存器与内存分开。例如,它们可以以它们具有512字节RAM的方式公开它,并且它们中的前64个作为32个16位寄存器公开,并且同时可作为可寻址RAM访问。或者,另一个例子,MosTek 6502"零页" (RAM范围0-255,访问使用的1字节地址)是寄存器的不良替代,因为CPU中的实际寄存器很少。但是,这对于较大的设置来说可扩展性很差。
寄存器的优点如下:
他们是最快的。它们在典型的现代系统中比任何缓存更快,比DRAM更快。 (在上面的例子中,RAM可能是SRAM。但是几千兆字节的SRAM非常昂贵。)而且,它们接近处理器。寄存器访问和DRAM访问之间的时间差可达到200或甚至1000之间的值。即使与L1缓存相比,寄存器访问通常也要快2-4倍。
他们的数量有限。如果明确地解决了任何内存位置,典型的指令集将变得过于膨胀。
它们分别针对每个CPU(核心,线程,哈特)。 (在固定RAM地址作为特殊寄存器角色的系统中,例如zSeries,这需要在绝对地址中对这种服务区域进行特殊重映射,每个核心分开。)
它们允许进行特定优化,如register renaming。如果使用内存地址,这太复杂了。
此外,有些寄存器无法在单独的Block RAM中实现,因为对RAM的访问需要更改。我指的是"执行阶段"在最简单的CPU设计中注册,其取值如"指令提取阶段","指令解码阶段"," ALU阶段","数据写入阶段& #34;等等,这个寄存器等同于更复杂的(流水线,无序)设计;总线访问上也有不同的缓冲寄存器,等等。但是,这样的寄存器对于程序员来说是不可见的,所以你可能并不意味着它们。