什么是寄存器

简介: Java编译器输出的指令流,基本上是一种基于栈的指令集架构,而与之相对的另外一套常用的指令集架构是基于寄存器的指令集。早期的android,即android4.4之前使用的JVM是Dalvik VM,就是基于寄存器架构的。

与java相关的


  • Java编译器输出的指令流,基本上是一种基于栈的指令集架构,而与之相对的另外一套常用的指令集架构是基于寄存器的指令集。早期的android,即android4.4之前使用的JVM是Dalvik VM,就是基于寄存器架构的。


  • 基于栈的指令集主要的优点是可移植,寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则不可避免地受到硬件的约束。
  • 栈架构指令集的主要缺点是执行速度相对来说会稍慢一些。所有主流物理机的指令集都是寄存器架构。


看示例找感觉


以上是一些结论,本文的重点是讨论上文中所提的寄存器,那寄存器是什么呢?其实这些计算机的原理知识之前上学的时候都学过,很遗憾当时听的也很头大,现在都还给老师了。


进入正题,先来看下维基百科的解释:


10.jpg


嗯,反正我看完是没什么感觉


再来看网上的一个例子:


“现代计算机,虽然性能很高,但是和上世纪7、8十年代的计算机比,其实结构都差不多。现在讲存储,一般讲有内存和外存,内存一般有寄存器(register),缓存(cache)和内存(memory),有些小型应用例如MCU没有cache,甚至没有memory——直接从flash/ROM到register。寄存器是CPU基础单元,CPU直接处理的内存就它了,好比医院,医生对面的椅子就是寄存器,要看病的病人(data)就坐这个椅子(register);已经挂号的(data)进入诊室(cache)排队,其他的就在医院里(memory)。医生可以操作的就是面对面的病人,其他人要看病(如急病)也需先坐上这个位置,这是最快的。诊室里的座位相对于cache,一般cache都是sram存储器,速度很快,但一般cpu不会直接访问,而是要把数据挪到register后才可直接操作,而一般的内存为DRAM,速度比SRAM慢多了,而且通过总线访问,速度就更慢了。”


再看下图:计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。


11.png


最后再看一个计算机的存储体系:


12.jpg


图中Registers就是寄存器,怎么样,有点感觉了吗?


从头来说


假设我们做一个回向电路,把输出连回到输入,我们用OR门举例:


13.jpg


首先都输入0,那么输出将会是0


14.jpg


如果将A变成1,那么输出将会是1


15.jpg


一转眼的功夫输出回到B,那么B为1,OR门看到的结果是输入A、B都为1,

1 OR 1 仍然为1,所以输出不变


16.jpg


如果将A变成0,0 OR 1 输出仍然是 1


17.jpg


现在我们有个电路能记录1,然而却有个小问题,就是无论怎么试,都无法从1变回0(如下两图)


20.jpg


25.jpg21.jpg


现在看一个相同电路,不过这次用AND 门


22.jpg


A、B均为1,  1 AND 1 为 1


25.jpg


如果之后A设置为0,由于是AND门,所以输出为0,B为0


27.jpg


28.jpg


这个电路能记录0,和之前那个相反,无论A设置什么值,电路始终输出0


30.jpg


31.jpg


现在我们有了能记录0和1的电路


33.jpg


为了做出有用的存储,我们将两个电路合起来,变成:AND-OR LATCH


34.jpg


它有两个输入:

  • 设置(set)   输入,将输出变成1
  • 复位(reset)输入,将输出变成0


35.jpg


36.jpg


如果“设置”和“复位”都是0,电路会输出最后放入的内容,也就是说它存住了1bit的信息!这就是存储。


之所以叫“LATCH(闩锁)”,是因为它“锁定”一个特定值并保持状态。将数据放入叫“写入”,将数据输出叫“读取”。好了,现在我们终于有办法存一个bit了。

麻烦的是用两条线来输入,也就是SET和RESET,有点儿麻烦,为了更易用,我们希望只有一条输入线,将它设为0或1来存储值。还需要一根线来“启用”。“启用”时允许写入,没“启用”时锁定。这条线叫“允许写入线”。加一些额外逻辑门,可以做出以下电路 :


38.jpg


这个电路称为“门锁”,因为门可以打开或关上。这个电路稍微有些复杂了。


39.jpg


我们不想关心单独的逻辑门,我们封装一下,把“门锁”放到盒子里(一个能存单个bit的盒子)。来看下这个新组件:


40.jpg


我们来测试一下这个新组件,一切都从0开始,如果将输入从0变成1,或从1变成0,什么也不会发生,输出仍然是0 。因为WRITE ENABLE 是关闭的(0),来防止内容变化


41.jpg


42.jpg


所以当WRITE ENABLE输入1,打开门后可以输入1,并将1存起来,这样输出也是1了。


43.jpg


我们可以关掉门(WRITE ENABLE =0),输出会保持1,此时输入随便是什么,输出都不会变(保持1)。


44.jpg


如果再次打开门(WRITE ENABLE =1),如果输入为0,输出也将是0:


45.jpg



最后关上门,输出会保持0


47.jpg


当然存1bit没什么大用,但我们没限制只能用一个组件,如果我们并排放8个,可以存8位,比如一个8bit数字。一组这样的组件叫寄存器寄存器能存多少个Bit,叫“位宽”。早期电脑用8位寄存器,然后是16位,32位,如今很多计算机都有64位宽的寄存器了。


CPU中寄存器又分为指令寄存器(IR)、程序计数器(PC)、地址寄存器(AR)、数据寄存器(DR)、累加寄存器(AC)、程序状态字寄存器(PSW),这里就不深入讨论了。







相关文章
|
存储 数据处理 内存技术
寄存器
一、什么是寄存器 寄存器是计算机硬件中的一种存储设备,它用于暂时存储和处理数据。寄存器位于计算机的中央处理器(CPU)内部,通常是由高速的SRAM(静态随机存储器)构成。寄存器具有以下特点: 1. 速度快:寄存器位于CPU内部,与CPU的时钟频率相同,因此访问寄存器的速度非常快,能够在一个时钟周期内完成读取或写入操作。 2. 容量小:由于寄存器是CPU内部的存储设备,其容量相对较小。通常每个寄存器的容量为几个字节或几十个字节,用于存储临时数据、指令和地址等。 3. 数据处理:寄存器可以用于存储和处理数据。CPU可以直接从寄存器中读取数据,并进行运算、逻辑操作等。 4. 寄存器类型:根据不同的功
154 0
|
7月前
|
存储 缓存 编译器
DSP存储器与寄存器管理
DSP存储器与寄存器管理
242 1
|
7月前
|
索引 存储 C语言
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
293 0
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
|
7月前
|
存储 缓存 Linux
【C函数】读寄存器为什么要用ioremap_nocache
【C函数】读寄存器为什么要用ioremap_nocache
210 0
|
存储
寄存器介绍
一、寄存器的定义 寄存器是计算机中的一种存储设备,用于暂时存储指令和数据。它位于计算机的中央处理器(CPU)内部,是最快速的存储器之一。寄存器的容量较小,但速度非常快,能够快速读取和写入数据。 二、寄存器的功能 数据存储:寄存器可以暂时存储指令和数据,供CPU进行读取和处理。 数据传输:寄存器可以在CPU内部传输数据,实现不同部件之间的数据交换。 运算操作:寄存器可以进行基本的算术和逻辑运算,支持CPU的运算功能。 地址定位:寄存器可以存储指令和数据的地址信息,帮助CPU准确定位数据的位置。 三、寄存器的类型 通用寄存器:通用寄存器用于存储临时数据,供CPU进行运算操作。 累加寄存器:累
333 0
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
154 0
【STM32】 相关寄存器总结
我们通过了解GPIO口的工作方式以后,我们知道了数据可以通过配置成上下拉、模拟等等的配置,这些功能的配置都跟我们的GPIO的相关寄存器有关。那么我们就要了解GPIO的相关的寄存器。
【STM32】 相关寄存器总结
|
存储 Java
04-程序计数器(PC寄存器)
JVM中的程序计数寄存器(Program Counter Register)中,Register的命令源于CPU的寄存器,寄存器存储指令的线程信息。CPU只有把数据装载到寄存器才能够运行。
294 0
04-程序计数器(PC寄存器)
|
vr&ar
8086 寻址方式(一)CPU和主存中的寻址方式
     通常,一条带有操作数的指令要指明两个问题:一是进行什么操作,二是用什么方式寻找操作数的存放地址。我们将寻找操作数存放的地址的方式成为寻址方式。当一条指令带中有多个操作数时,每个操作数的寻址方式可能不同,因此,寻址方式是针对指令中指定的操作数(源操作数或者是目的操作数)而言的。
1717 0
|
存储 安全 编译器
CPU和寄存器详解
CPU和寄存器详解
890 0
CPU和寄存器详解