文章来源于:# 1.2.2 认识各个硬件部件
1.2.2 认识各个硬件部件
创建时间:2021年11月29 14:00主存储器的基本组成
其中 MDR (Memory Address Register)是存储地址寄存器;MAR(Memory Data Register)是存储数据寄存器。所谓 MDR 可以理解成高铁站上的大屏幕,像下面这种:

这些并不是真实的位置,但是说出了真实的位置在什么地方,比如第一条,福州,检票口 6 ,这里只是记录去福州的检票口位置,并不是真正的位置,这个时候就可以根据这条信息前往对应的位置。而这个屏幕就相当于 MDR ,记录的是一条条地址信息。
视频中使用菜鸟驿站做的比喻,更贴切,比如:11-2-5,就是代表第11排第2层第5个包裹,根据这个就能很容易找到包裹。MAR 就是具体的包裹,在计算机里面就是从内存中取出来的数据。下面我看一下菜鸟驿站的大致结构:
假设包裹是绿色的框框。其中拿着取货码就可以找包裹了,找到包裹就可以扫码取走了。其中编号是放包裹的货架。其中存放取货码的是 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 来表示,对应的换算如下表所示:
| 换算前单位 | bit | B | K | M | G |
|---|---|---|---|---|---|
| 1B | 8 | ||||
| 1K | 8 * 2^10 | 2^10 | |||
| 1M | 8 * 2^20 | 2^20 | 2^10 | ||
| 1G | 8 * 2^30 | 2^30 | 2^20 | 2^10 | |
| 1T | 8 * 2^40 | 2^40 | 2^30 | 2^20 | 2^10 |
运算器的基本组成
其中 ACC (Accumulator)为累加器,MQ(Multiplier-Quotient Register)为乘商寄存器,ALU(Arithmetic And Logic Unit)算术逻辑单元,X为操作数寄存器。其中 ACC 、 MQ 和 X 为寄存器,寄存器是存储数据的地方,这些寄存器所存储不同类别类型操作数为:
| 加法 | 减法 | 乘法 | 除法 | |
|---|---|---|---|---|
| ACC | 被加数及和 | 被减数及差 | 乘积高位 | 被除数及余数 |
| MQ | 乘数及乘积低位 | 商 | ||
| X | 加数 | 减数 | 被乘数 | 除数 |
这个表的意思是,例如进行加法的时候,ACC 累加寄存器会存加数及和这两个数据,而 MQ 乘商寄存器就啥也不存,X操作数寄存器存放加数;在加法中有加数和被加数,比如 2+3=5 ,加数为 3 ,被加数 2 ,和是 5 ,那么在进行运算这个表达式的时候,会把 2 和 5 放到 ACC 累加寄存器中,把 3 放到 X 操作数寄存器中。这样再去看书中的例子就能很容易看懂了。
控制器的基本组成
控制器由 PC(Program Counter)程序计数器、IR(InstructionRegister)指令寄存器和 CU(Control Unit)控制单元组成。PC 用来存放当前欲执行指令的地址,与主存的 MAR 之间有一条直接通路,且具有自动加 1 的功能,即可自动形成下一条指令的地址。 IR 用来存放当前的指令, IR 的内容来自主存的 MDR。CU 用来分析当前指令所需完成的操作,并发出各种微操作命令序列,用以控制所有被控对象。
计算机的工作过程
我们以课本中的 ax^2 + bx + c 为例,当加载这个表达式到主存储体中,像下面这样:
第一轮:
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 来进行分析理解。