欢迎光临散文网 会员登陆 & 注册

什么是寄存器?寄存器的分类与作用?

2022-09-15 11:27 作者:-遮瑕-  | 我要投稿

什么是寄存器?

    学习过数电的同学应该都知道,数字电路常分为两类,也就是组合逻辑电路和时序逻辑电路,对于组合逻辑电路来说,它的输出只和现在的输入有关,也就是说,如果我用一个数据选择器,我就只能每次使用的时候都给它输入我需要的地址。

    但是在CPU里面,程序需要存放、数据需要存放、计算出来的结果也需要存放,那么使用组合逻辑电路就无法实现了,所以就需要使用时序逻辑电路来制作出一种可以暂时存放我所需要的状态的电路,我们称这种电路为“寄存器”。

CPU结构简单示意

    放到CPU之内,我们考虑到各个寄存器的工作条件不同、需要存储的内容也不同,所以我们将其分为了各种类型的寄存器,存储程序状态的、存储指令位置的,这种寄存器我们就将它组合到一起,称之为“控制器”,对于进行运算的寄存器,也就是累加器、算术逻辑单元,我们又放一起,称之为“运算器”。

寄存器的组成?

    前文已经说过了,寄存器由时序逻辑电路组成,通常由锁存器或者D触发器构成,根据构成寄存器使用的触发器数量不同,就形成了不同位数的寄存器。

寄存器的分类?

    我在这里以8086CPU的结构为例。


8086CPU寄存器简单分类


    我们常常把寄存器分为几个大类,比如寄存器寄存器,首要功能当然是可以寄存我的数据,那么这类寄存器我们就称之为通用寄存器,主要功能就是用作储存,至于其余功能会在后面详细讲解;

    其次,对于计算机来说,它内部所有东西都是0101,不管是指令还是数据都是放一起的,所以为例区分是数据还是指令,我们便使用了寄存器来储存地址,指令寄存器内的地址所在的0101自然就是指令,数据寄存器内的地址所在的0101自然就是数据;

    同时,如果我想要寻址10位的地址,那我是不是就需要我自己有10位?但是8086有16位,而它的地址总线却有20位,所以设计师们就想出了一个绝妙的方法,用两个16位组成一个20位,所以段寄存器就应运而生了,就好比我手上有两个数码管,单独拿一个只能显示0到9这十个数,但是如果我使用两个,一个作为十位,也就是所谓的“段”,一个作为个位,那么我就可以表示0到99这一百个数,而这就是段寄存器的作用;

    要理解栈寄存器就得先理解栈,栈可以理解为一个箱子,我只能从上面一个一个的放东西,拿出来也只能从最上面的拿,也就是先进后出、后进先出,栈的使用是十分广泛的,广泛到什么程度呢,广泛到8086CPU单独设计了栈寄存器来储存栈所在的位置,对于汇编来说,使用软件实现栈是特别繁琐且低效的,所以便直接使用一个寄存器指出栈的位置不就好了吗,直接说这个位置就是栈,入栈出栈的指令都到这里来执行;

    最后就是标志寄存器FR了,

    比如说当加法产生进位时,对于我们电路来说,出来的结果是结果溢出的结果,比如1加1等于0,那我们怎么判断这个0和真正的0的区别呢?显然,我们需要一个东西来标记这个溢出的现象,只要有溢出,那么处理器就可以知道这个数应该是2(也就是10)而不是0。

寄存器的功能?

    下面呢,我将以8051单片机结合8086CPU从写程序的角度来一步步介绍各个寄存器的作用。

    众所周知,在汇编里,我们写入的是指令,储存的是数据,但是前面有说过,数据和指令在单片机内都是01010101的高低电平,我们需要通过某种手段来确保我们单片机上电时第一次执行的是指令而不是数据,那么在51单片机内就使用了一个寄存器PC来指向程序,只要当复位时这个寄存器每次都指向0000,那么我们就可以确保0000处的指令一定会被第一个执行,从而对单片机实现编程控制。

    既然我们通过PC找到了指令的位置,那么我们应该在哪去找数据的位置呢,为了可以有效的储存数据,51使用了通用寄存器来存放数据,当然,只有寄存器显然不太够用,所以也可以通过寄存器将数据存放到ROM内,这里我们以特殊的储存方式——栈进行举例。

    首先介绍为什么我们需要栈,比如我们想进行数据交换的时候,由于栈先入后出的特性,我们可以简单的实现数据的交换,但是想要通过汇编编程来实现栈是很耗资源的,为了可以简单的实现栈,51采用了寄存器来储存栈的位置,即可以人为的认为一片空间为栈,使用寄存器来储存栈顶部所在的位置。


什么是寄存器?寄存器的分类与作用?的评论 (共 条)

分享到微博请遵守国家法律