认识各个硬件部件

412 阅读6分钟

文章来源于:# 1.2.2 认识各个硬件部件

1.2.2 认识各个硬件部件

创建时间:2021年11月29 14:00

主存储器的基本组成

image-20211129135856845

图1

其中 MDR (Memory Address Register)是存储地址寄存器;MAR(Memory Data Register)是存储数据寄存器。所谓 MDR 可以理解成高铁站上的大屏幕,像下面这种:

车站大屏幕显示的d6504列车发车信息.

图2

这些并不是真实的位置,但是说出了真实的位置在什么地方,比如第一条,福州,检票口 6 ,这里只是记录去福州的检票口位置,并不是真正的位置,这个时候就可以根据这条信息前往对应的位置。而这个屏幕就相当于 MDR ,记录的是一条条地址信息。

视频中使用菜鸟驿站做的比喻,更贴切,比如:11-2-5,就是代表第11排第2层第5个包裹,根据这个就能很容易找到包裹。MAR 就是具体的包裹,在计算机里面就是从内存中取出来的数据。下面我看一下菜鸟驿站的大致结构:

image.png

图3

假设包裹是绿色的框框。其中拿着取货码就可以找包裹了,找到包裹就可以扫码取走了。其中编号是放包裹的货架。其中存放取货码的是 MDR ,找到数据以后会放到 MAR 中,也就是扫码取走的柜台。

存储体是由存储单元构成的,一个存储单元可存储一串二进制代码,像 0000 1101 0011 0001 这样的串,称这样的串二进制代码为一个存储字,注意:这里的“字”,并不是字节;而串的位数称为存储字长,像 0000 1101 0011 0001 这样的存储字有 16 位,也就是这里的存储字长为16。而每一位可以存储的为 0 或 1,用于存放 0 或 1 的元件为存储元。

现在我们再看图3中的123456,可以理解为存储单元的编号,而 MDR 中存储的就是这些编号;所以我们可以很好的理解假如MDR的位数是8位,那么可以存的编号范围位 0-2^8 ,同样存储体的存储单元个数为 2^8 个。通过上面我们知道存储单元最后都会放到 MAR 中,也就代表着,MAR 假如是 16 位,那么存储体中存储单元的位数也就是 16 位。通过 MAR 和 MDR 我们就可以得到存储体的容量了,也就是:

存储体容量=MDR范围 * MAR位数

例如,MAR 为 16 位,根据 2^16 = 65536 ,表示此存储体内有 65536 个存储单元(即 64 K 个存储字, 1K = 1024 = 2^10);而 MDR 为 32 位,表示存储容量为 2^16 * 32 = 2^21 = 2 M 位(1 M = 2^20)。

得到的单位是 bit ,也就是位,现在一般都不用 bit 来表示,可以转换成 M 或 G 来表示,对应的换算如下表所示:

换算前单位bitBKMG
1B8
1K8 * 2^102^10
1M8 * 2^202^202^10
1G8 * 2^302^302^202^10
1T8 * 2^402^402^302^202^10
表1

运算器的基本组成

image-20211129155607136

图4

其中 ACC (Accumulator)为累加器,MQ(Multiplier-Quotient Register)为乘商寄存器,ALU(Arithmetic And Logic Unit)算术逻辑单元,X为操作数寄存器。其中 ACC 、 MQ 和 X 为寄存器,寄存器是存储数据的地方,这些寄存器所存储不同类别类型操作数为:

加法减法乘法除法
ACC被加数及和被减数及差乘积高位被除数及余数
MQ乘数及乘积低位
X加数减数被乘数除数
表2

这个表的意思是,例如进行加法的时候,ACC 累加寄存器会存加数及和这两个数据,而 MQ 乘商寄存器就啥也不存,X操作数寄存器存放加数;在加法中有加数和被加数,比如 2+3=5 ,加数为 3 ,被加数 2 ,和是 5 ,那么在进行运算这个表达式的时候,会把 2 和 5 放到 ACC 累加寄存器中,把 3 放到 X 操作数寄存器中。这样再去看书中的例子就能很容易看懂了。

控制器的基本组成

image-20211129162335568

图5

控制器由 PC(Program Counter)程序计数器、IR(InstructionRegister)指令寄存器和 CU(Control Unit)控制单元组成。PC 用来存放当前欲执行指令的地址,与主存的 MAR 之间有一条直接通路,且具有自动加 1 的功能,即可自动形成下一条指令的地址。 IR 用来存放当前的指令, IR 的内容来自主存的 MDR。CU 用来分析当前指令所需完成的操作,并发出各种微操作命令序列,用以控制所有被控对象。

计算机的工作过程

我们以课本中的 ax^2 + bx + c 为例,当加载这个表达式到主存储体中,像下面这样:

image-20211129164054677

表3

第一轮:

1)程序刚开始的时候 PC 程序计数器处于 0 的位置;

2)使 MAR 存储地址寄存器使其值为 0 ;

3)MAR 存储地址寄存器根据 0 这个地址编号从存储体中找到对应的数据 0000 0100 0000 1000 ;

4)将数据放入 MDR 存储数据寄存器中;

5)把这条指令放到 IR 指令寄存器中 ;

6)交给 CU 控制单元,通过分析,这是一条取值,取出对应的值 00 0000 1000 ,也就是 8 ;

7)写入到 MAR 存储地址寄存器中,MAR 存储地址寄存器去找到对应的数据 x ;

8)拿到数据后放到 MDR 存储数据寄存器中;

9)将这个数存入 ACC 累加寄存器。

第二轮:

经过第一轮, PC 程序计数器已经指向了 1 。

1)PC 程序计数器变成了 1 ;

2)使 MAR 存储地址寄存器使其值为 1 ;

3)MAR 存储地址寄存器根据 1 这个地址编号从存储体中找到对应的数据 0000 0100 0000 1001 ;

4)将数据放入 MDR 存储数据寄存器中;

5)把这条指令放到 IR 指令寄存器中 ;

6)交给 CU 控制单元,通过分析,这是一条乘法指令,取出对应的值 00 0000 1001 ,也就是 9 ;

7)写入到 MAR 存储地址寄存器中,MAR 存储地址寄存器去找到对应的数据 a ;

8)拿到数据后放到 MDR 存储数据寄存器中;

9)将原本 ACC 累加寄存器的数存入 X 操作数寄存器;

10)将 MDR 的数据存入 MQ 中;

11)经过 ALU 算术逻辑单元计算将结果的高位存入 ACC 累加寄存器中,低位存入 MQ 乘商寄存器中。

接下来的步骤我省略了,主要就是参考这个步骤和表 2 来进行分析理解。