我刚刚开始学习汇编(之前我使用过c ++).
我想知道为什么除了使用内存之外我们还需要使用寄存器,为什么不使用内存呢?
我想最明显的原因是在寄存器中进行计算比在内存中进行计算要快得多.但这是唯一的原因吗?
phu*_*clv 10
寄存器放在CPU内部,直接放在ALU上,因此信号几乎可以立即传播.它们也是最快的内存类型,但它们占用了大量空间,因此我们只能使用有限数量的内存.增加寄存器的数量
更常用的数据将放在缓存中以便更快地访问.在过去,缓存非常昂贵,因此它们是可选部件,可以单独购买并插入CPU外部的插槽.如今,他们经常和CPU一模一样.高速缓存由SRAM构成,其比寄存器单元小,但可能慢几十或几百倍.
主存储器将由DRAM制成,每个单元只需要一个晶体管,但比寄存器慢几千倍,因此我们不能只在高性能系统中使用DRAM.然而,一些嵌入式系统确实使用寄存器文件,因此寄存器也是主存储器
实际上,有一些微小的实现不会将寄存器与内存分开。例如,他们可以以拥有 512 字节 RAM 的方式公开它,其中前 64 个公开为 32 个 16 位寄存器,同时可作为可寻址 RAM 访问。或者,另一个例子,MosTek 6502“零页”(RAM 范围 0-255,访问使用的 1 字节地址)是一个糟糕的寄存器替代品,因为 CPU 中的实际寄存器数量很少。但是,这对于更大的设置的可扩展性很差。
寄存器的优点如下:
他们是最快的。在典型的现代系统中,它们比任何缓存都快,比 DRAM 更快。(在上面的例子中,RAM 可能是 SRAM。但是几 GB 的 SRAM 非常昂贵。)而且,它们接近于处理器。寄存器访问和 DRAM 访问之间的时间差异可以达到 200 甚至 1000 的值。即使与 L1 缓存相比,寄存器访问通常也快 2-4 倍。
他们的数量是有限的。如果显式寻址任何内存位置,典型的指令集将变得过于臃肿。
它们分别特定于每个 CPU(核心、线程、hart)。(在固定 RAM 地址充当特殊寄存器角色的系统中,例如 zSeries,这需要在绝对地址中对此类服务区域进行特殊重新映射,为每个内核分开。)
它们允许特定的优化,如寄存器重命名。如果使用内存地址,这太复杂了。
此外,有些寄存器无法在单独的 Block RAM 中实现,因为对 RAM 的访问需要更改。我指的是最简单的 CPU 设计中的“执行阶段”寄存器,它取“指令提取阶段”、“指令解码阶段”、“ALU 阶段”、“数据写入阶段”等值,这个寄存器在更多方面等价于复杂(流水线、乱序)设计;还有总线访问上的不同缓冲寄存器,等等。但是,这样的寄存器对程序员是不可见的,所以你可能不是故意的。