接下来我们来到我们第一章的第二部分, 这一小节我们主要来讲一下主机里面的主存储器、控制器、运算器的内部细节。u1s1,机组的内容很多,知识点很杂,建议同学们自己动手记好笔记
各个硬件的工作原理
1.主存储器
主存储器包含存储体、MAR、MDR
为了方便大家对主存储器有个直观的影响,我们拿生活中的菜鸟驿站举个例子
各位彭于晏们到菜鸟驿站取快递,首先把自己的取件号告诉店员,店员知道取件号之后就回去货架取出我们的快递,然后放在柜台上,我们拿走就行了。回到主存储器,我们把自己的取件号告诉店员就相当于在MAR(Memory Address Register)存入一个数据的地址,然后MAR就去存储体里面根据地址去找,找到之后数据存在MDR(Memory Data Register)
1.1存储体
1.1.1存储元
存储元:存储二级制的电子元件,每个存储元可存1bit(我们不用过度追究,我们只需要知道每个存储元可存1bit)
1.1.2存储单元
存储体是由一个个的存储单元构成的,每个存储单元存放一串二进制代码,每一个二级制代码我们就叫它存储字,每一个存储单元有对应的地址,存储字和地址我们等一下会讲到
1.1.3存储字
存储字(Word):存储单元中二进制代码的组合
1.1.4存储字长
存储单元中二进制代码的位数,也就是每一个存储单元可以放得下多少个二级制位,通常可以存放8bit的整数倍
1.1.5地址
每一个存储单元会对应一个地址,地址是从0开始的,我们之前提到过(联想彭于晏取快递),数据地址存放在MAR,如果我们要地址2的数据,那么就要在MAR中存入2这个地址。
另外再给大家补充易混淆的知识点:1个字节(Byte)=8bit 1B=1个字节 1b=1个bit
有些同学容易混淆字和字节的意思,1个字可能表示16个bit也可能等于32bit,具体要看我们计算机硬件怎么设计,还有一个点是,我们描述一个字节的时候,通常是用一个大B表示,但是描述一个比特的时候,是用一个小b表示。举个生活中的例子,我们去移动办理宽带,店员告诉我们流量可达100Mbps,但是我们用的时候发现只有下载速度只有10Mb/s,不是我们被骗了,而是小b转换成大B要除以8
1.2MAR
通过上面的讲述,相信同学们可以很好理解MAR是干嘛的了,就是存放存储单元的地址
因为数据的地址需要存放在MAR中,所以MAR的位数直接反映了存储体有多少个存储单元。比如:MAR=4位----->总共有个存储单元。
1.3MDR
MDR就是存放一个个的存储单元的数据,所以MDR位数=存储字长。比如:MDR=16位------>每个存储单元可存放16bit
2.运算器
上个文章我们提到过,运算器实现算术运算(加减乘除)、逻辑运算(与或非),运算器分为ACC、ALU、MQ、X,其中ALU是最为核心的
2.1ACC(Accumlator)
ACC:累加器,用于存放操作数或者运算结果
2.2MQ(Multiple-Quotient Register)
MQ:乘商寄存器,顾名思义就是在乘法或者除法的时候会用到,同样的也是存放操作数和运算结果
2.3X
X:通用寄存器,用于存放操作数
2.4ALU
ALU:算术逻辑单元,作为运算器的核心,实现算数运算、逻辑运算
这三个处理不同的逻辑运算的时候会有不同的功能,我们等一下会举个例子来理解
3.控制器
3.1 PC(Program Counter)
PC:程序计数器,存放下一条指令地址,有自动+1的功能
3.2 IR(Instruction Register)
IR:指令寄存器,存放当前执行的指令
3.3 CU(Control Unit)
CU:控制单元,分析指令,给出控制信号,是控制器的核心。上个文章中,我们将控制器比喻成霸道总裁,而CU就是霸道总裁的老婆,总裁也要听老婆的话
控制器总体怎么工作的呢?PC取得指令之后,拿给IR分析指令,最后交给CU执行指令
接下来我们用具体的例子来看一下计算机的工作流程
4.工作过程
假如我们用C语言写了这么一段代码
那么计算机是怎么来处理运算的呢?
计算机会将一些操作数(加减乘除)和一下自变量存起来,就像这样,方便需要的时候取出来就行了
4.1初始
不管是要进行什么运算,我们第一步都要取指令,然后分析指令,最后执行指令。
我们来讲一下怎么取指令
我们来看一下这个图,前面提到过初始的时候从地址0开始,指令的存放地址和需要执行的操作在图1
第一步:PC=0,指向第一条指令的地址
第二步: MAR收到地址之后就要去存储体取数据了,此时MAR=0
第三步:找到相应的数据之后就放在MDR中,MDR=000001 0000000101
第四步:货物已经放在DMDR中了,所以我们要把它取走,通过数据线把货物也就是这条指令传输到IR中,IR=000001 0000000101
第五步:IR把操作码发送给CU控制单元,让控制单元这个霸道总裁来指挥
第六步:CU霸道总裁收到操作码之后,进行分析,告诉IR这是一个取数指令,然后IR就乖乖的把地址发送给了MAR,又要取快递了,所以MAR=0000000101,也就是MAR=5
第七、八步:取快递的步骤前面提到过了,和二、三两步一样,最后MDR=2
第九步:MDR发送给ACC,所以ACC=2
所以我们上面的九步动作,只是处理地址=0的指令的过程,所以计算机在背后真的是默默付出
我们之前说了取指令这一步不管是什么操作都会执行,上面中1~4步属于取指令,第5步属于分析指令,6~9属于执行取数指令
4.2PC自动加1、CU分析指令、CU指挥其他部件执行指令
上一条指令之后ACC=2,PC=1;为什么PC=1?因为PC有自动+1的功能,从原来的地址0加1之后就指向了地址1的指令,所以PC=1;
前面1~5的步骤和上面的处理地址0的步骤是一样的,MDR=000100 0000000110;IR= 000100 0000000110
第六步:通过第5步CU霸道总裁分析出来这个一个乘法的指令,之前我们已经取到了a=2存在了ACC里面,所以这次霸道总裁CU命令取出地址码=0000000110的数据,所以MAR=0000000110=6
第七步、第八步:提到了很多次,也不过多赘述,就是通过地址码取快递的过程,MDR=3
第九步:MDR会通过数据线,发送到MQ乘商寄存器当中,所以此时MQ=3
第十步:ACC会把被乘数放到X寄存器里面,X=2
第十一步:ALU会进行乘法操作,是MQ*X=2*3=6放在ACC里面
同样的PC有自动+1的功能,执行之后,PC=2,指向了主存地址=2的指令
第一到第五步骤和之前都是一样的,都是取指令的操作
第六步:在第五步CU拿到操作码之后分析指令,发现这是一个加法操作,所以去主存储器里面取快递,把地址码放在MAR中,MAR=0000000111
第七~八步骤:取快递的过程,把取好的快递放在MDR中,MDR=1
第九步:MDR发送给X,使X=1
提问:为什么这次MDR是发送给X,上一个步骤是发送给MQ?
因为这一次是一个加法的操作,MDR先发送给X,然后ALU进行操作,把ACC+X得到的结果发送给ACC;而上一次操作是乘法操作,MDR发送给MQ作为乘数,然后ACC的数据发送给X作为被乘数,ALU进行操作将MQ*X得到的数据发送给ACC
第十步:上面的问题其实已经提到第十步了,就是ALU进行操作,把ACC+X得到的结果发送给ACC
同样PC自动+1,PC= 3
前五步就不过多赘述,就是取指令给CU分析的过程
第六步:CU分析之后发现这是一个存数据的指令,然后就把需要存的地址发给了MAR
第七步:ACC把数据发给了MDR,进行存的操作,我们之前都是取快递,而这次是存快递,把地址给店员,把货物放在柜台,
第八~九步:MAR和MDR把地址和数据发送给存储体,存放在存储体中,这样就存放好了
PC自动+1,PC=4
前五步取完指令之后,CU进行分析,发现这是停止程序操作,所以程序停止运行
通过上面的这个例子一步步的来模拟程序的运行,相信同学们对运算器、控制器、主存储器相互之间协调工作有了更深刻的认识
5.思维导图
方便以后复习,我把思维导图放在下面
注意:现在计算机通常把MAR和MDR放在了CPU里面,所以以后提到CPU里面有MAR和MDR也不要觉得奇怪