为什么需要寄存器(为什么不只使用内存)?

use*_*463 6 x86 assembly

我刚刚开始学习汇编(之前我使用过).

我想知道为什么除了使用内存之外我们还需要使用寄存器,为什么不使用内存呢?

我想最明显的原因是在寄存器中进行计算比在内存中进行计算要快得多.但这是唯一的原因吗?

phu*_*clv 10

因为RAM很慢.非常慢.

寄存器放在CPU内部,直接放在ALU上,因此信号几乎可以立即传播.它们也是最快的内存类型,但它们占用了大量空间,因此我们只能使用有限数量的内存.增加寄存器的数量

  • 模具尺寸
  • 信号传播所需的距离
  • 在线程之间切换时保存上下文的更多工作

读取如果寄存器如此快速,为什么我们没有更多?

更常用的数据将放在缓存中以便更快地访问.在过去,缓存非常昂贵,因此它们是可选部件,可以单独购买并插入CPU外部的插槽.如今,他们经常和CPU一模一样.高速缓存由SRAM构成,其比寄存器单元小,但可能慢几十或几百倍.

主存储器将由DRAM制成,每个单元只需要一个晶体管,但比寄存器慢几千倍,因此我们不能只在高性能系统中使用DRAM.然而,一些嵌入式系统确实使用寄存器文件,因此寄存器也是主存储器

更多信息:我们可以拥有一台只有寄存器作为内存的计算机吗?

  • 具有少量常用存储器位置(例如寄存器)也可以保持指令大小 - 原始的8 x86 GP寄存器可以以3位索引,与每次存储器地址指定相比.OTOH,这只是一个可能的妥协; 如果你不介意慢一点(或者,如果你的CPU和RAM一样慢)还有其他可能性.取6502:它实际上有1个8位累加器和2个索引寄存器 - 周期; 但它具有紧凑形式的存储器访问指令到前256个RAM位置,然后可以像寄存器一样使用. (5认同)

Net*_*tch 5

实际上,有一些微小的实现不会将寄存器与内存分开。例如,他们可以以拥有 512 字节 RAM 的方式公开它,其中前 64 个公开为 32 个 16 位寄存器,同时可作为可寻址 RAM 访问。或者,另一个例子,MosTek 6502“零页”(RAM 范围 0-255,访问使用的 1 字节地址)是一个糟糕的寄存器替代品,因为 CPU 中的实际寄存器数量很少。但是,这对于更大的设置的可扩展性很差。

寄存器的优点如下:

  1. 他们是最快的。在典型的现代系统中,它们比任何缓存都快,比 DRAM 更快。(在上面的例子中,RAM 可能是 SRAM。但是几 GB 的 SRAM 非常昂贵。)而且,它们接近于处理器。寄存器访问和 DRAM 访问之间的时间差异可以达到 200 甚至 1000 的值。即使与 L1 缓存相比,寄存器访问通常也快 2-4 倍。

  2. 他们的数量是有限的。如果显式寻址任何内存位置,典型的指令集将变得过于臃肿。

  3. 它们分别特定于每个 CPU(核心、线程、hart)。(在固定 RAM 地址充当特殊寄存器角色的系统中,例如 zSeries,这需要在绝对地址中对此类服务区域进行特殊重新映射,为每个内核分开。)

  4. 它们允许特定的优化,如寄存器重命名。如果使用内存地址,这太复杂了。

此外,有些寄存器无法在单独的 Block RAM 中实现,因为对 RAM 的访问需要更改。我指的是最简单的 CPU 设计中的“执行阶段”寄存器,它取“指令提取阶段”、“指令解码阶段”、“ALU 阶段”、“数据写入阶段”等值,这个寄存器在更多方面等价于复杂(流水线、乱序)设计;还有总线访问上的不同缓冲寄存器,等等。但是,这样的寄存器对程序员是不可见的,所以你可能不是故意的。