一、计算机组成框图
为了方便大家对计算机工作过程的理解,在这里我又总结了详细的教程。
先来看一下计算机每个部分的功能:
二、思维导图
这里将计算机部件的各个概念,做了一个思维导图。
大家可以照着记忆,还是非常全面的。
三、部件剖析
(1)存储器
注意“字”和“字节”的区别。还有“B”和"b"的区别。
(2)运算器
(3)控制器
四、案例剖析(重点)
我们来分析一下这几行代码,在计算机中如何运作的。
int a=2,b=3,c=1,y=0;
y=a*b+c;
右侧是存储器内存图:
(1)a=2
首先是取值
。
来看一下详细的运转过程。
有几个需要注意的点:
(2)a*b
a
的值已经被送到ACC寄存器里面了。
所以现在的乘法指令的地址码(0000000110)指向的是另一个乘数b
的存放位置。
通过地址码(0000000110-->6)可以看到,取出的数是:0000000000000011,转为十进制就是3。
接下来b
的值3会通过数据总线,送到MQ
(乘商寄存器)。(图中第9步)
现在b
的值已经放入MQ里面。
我们还需要将a
的值从ACC里面拿出来,放在X寄存器里面。(CPU进行乘法操作的时候,会把被乘数a放在X寄存器,把乘数b放在MQ乘商寄存器里面)
接下来,CU会通过控制线,告诉ALU,让它进行乘法运算。
ALU就会把X和MQ寄存器里面存储的数相乘,最终的结果放入ACC。
所以ACC现在得到a*b
的值,即6。
如下图:
如果相乘的数特别大,ACC寄存器存不下,这时候就需要MQ寄存器辅助存储,MQ里面存放乘法运算结果的 低位。
和前面那一条指令(a=2)相比,第一步到第五步是相同的。
只有当控制单元分析出这一条指令是乘法指令的时候,接下来的操作才会有区别。
(3)a*b+c
上一个步骤取指令
之后,PC
自动加一。
所以,现在的PC
指向了2:
ACC寄存器里面存放了a*b
的值,即6。
前面五个步骤是一样的,通过前五个步骤,可以完成取指令和分析指令。
现在,CU会分析的指令操作码是000011,对应是加法操作。
接下来,CU会根据加法指令的执行步骤来指挥其他部件协调工作。
这次要计算的是a*b+c
,而a*b
的结果已经在ACC中了。所以这个加法指令的地址码指明的是c
变量的存放地址。
IR将地址码部分(0000000111-->7)传给了MAR,MAR再传给存储体。
存储体通过这个地址找到对应的值,即:0000000000000001-->1。然后将这个值送给MDR。
现在MDR里面存的就是c的值1。
然后MDR将c的值送入X寄存器里面。(加法运算的时候,ACC里面事先存了被加数,即a*b
;X寄存器会存放加数,即c
)
接下来控制单元会向ALU发送一个信号,告诉他此次要执行加法操作。
然后ALU就会把ACC和X寄存器里面存放的值加在一起,并且将加的结果放入ACC里面。
这样下来,最终ACC存入的结果是7(a*b+c)。
(4)y=a*b+c
接下来要将a*b+c
的值存入y
中。
之前进行的a=2
这些操作,都是取值
操作。
现在要做的,是要把a*b+c
的值存入y
中,是存值
操作。
:question:存值操作是如何进行的呢?
经过上面的分析,知道现在这一条指令是存数指令,也就是将ACC里面的值(7)存入地址码(0000001000-->8)所指明的存储单元中的位置。
8这个存储单元,刚好对应的是y
变量的存储位置。
具体步骤:
①IR将地址码部分(0000001000)送入MAR,用来指明此次需要存入哪一个存储单元。(图中第6步)
②还要将ACC里面的值通过数据总线,送入MDR里面。(图中第7步)
此时MDR里面保存了a*b+c
的值。
MAR里面的地址指明,这个值需要存入内存地址为8的地方。
③CU告诉存储器,此时要进行的是存入(写)操作。
主存储器会根据MAR所指明的地址,把MDR里面的数据,放到相应的位置。
所以,8号存储单元的值变为了7。
如图:
(5)停机
上面的取指令之后,PC的值还是会加一,指向下一个内存单元的地址。
此时,PC=4了。
首先还是要取出指令,PC将4号位置的地址送入存储器,存储器再将指令送入IR,IR再将操作码部分(000110)送入CU。
CU经过分析,发现这是一条停机指令。
这时候,程序运行结束了。
要停止一个进程的运行,就要通过系统调用来通知操作系统终止这个进程,接下来就是操作系统要进行的相关指令了。
这里不做探讨。
五、总结
计算机的工作过程:
任何一个指令的执行,都是这三个阶段:取指令、分析指令和执行指令。
无论执行的是什么指令,前面五个步骤(取指令和分析指令)都是一样的,只有分析完指令之后,CU才可以知道这条指令到底要做什么。接下来的步骤,对于不同的指令就有可能不一样。
“取指令”阶段,MDR里面的数据是要传送到IR寄存器的。
而在“执行指令”的阶段,CU会根据具体执行的指令来决定MDR里面的数据是放入ACC还是放入MQ或者其他寄存器里面。
根据指令执行周期的不同,CPU就可以区分出这次从内存中取出的到底是指令还是数据。
现代计算机通常把MAR、MDR也集成到CPU里面。
这次的案例,每一条指令只给出了一个操作码和一个地址码。有的计算机给出的指令,可能有多个地址码。
比如一条指令包含两条地址,这种指令就被称为二地址指令。
存储程序:在程序运行之前,指令和数据都会被提前存到主存里面。
参考:王道视频
整理文章内容不容易,多多支持。