计算机组成原理----计算机系统(1):https://developer.aliyun.com/article/1511508
(4)计算机工作过程:
计算机会将高级语言翻译为机器能读懂的机器语言,并且将其装入主存储器中,如下图所示,存储体中每个存储单元的存储字长为16bit
取指令:
程序运行前,(PC)=0,指向第一条指令的存储地址
① PC的值通过地址总线传送到主存储器的MAR中。此时(PC)=0,所以(MAR)=0,即
(PC)--->MAR
经过这个操作,控制器向主存指明了此时需要访问0号主存地址对应的数据,同时通过控制总线告诉主存,此时要进行的是读操作。
② 主存储器会根据MAR记录的信息去存储体中找到0号主存地址对应的存储单元,并且将存储单元的数据存放到MDR中,此时MDR中存放的就是CPU想读取的第一条指令,即
M(MAR)--->MDR 主存储器中MAR存放的地址对应的存储单元的数据放到MDR中
(MDR)=000001 0000000101
③ 这个数据起始就是一条指令,解释为"取数a至ACC",这条指令会通过数据总线放到IR中,导致(IR)=000001 0000000101,即
(MDR)-->IR
分析指令:
④ 该指令的操作码(前6bit)会被送到CU中,CU分析后得知这是"取数"指令,即
OP(IR)--->CU,OP(IR)表示取操作码
执行取数指令:
⑤ 接下来就需要将指令中的地址码指明的主存中数据取出来,并且放到ACC寄存器中,既然要读取地址码指向的数据,那么就需要先将地址码放到主存的MAR中,如下图所示,该存储单元存放的地址码=0000000101,就是要取5主存地址中的数据到ACC中,即
Ad(IR)--->MAR,Ad(IR)表示取地址码 (MAR)=5
⑥ 接下来主存会根据MAR的地址到存储体中找相应的数据,并把这一数据放到MDR中,即
M(MAR)---->MDR 导致(MDR)=0000000000000010=2
⑦ 最后在控制单元的指挥下,MDR中的数据会被送到ACC(累加寄存器)中,即
(MDR)--->ACC 导致(ACC)=0000000000000010=2
注:之前提到PC有自动+1的功能,在取指令这个动作完成后,PC就会自动+1了,即指明了下一条会执行的指令(主存地址为1的位置)
所以上一条指令完成取指后,(PC)=1,执行完该条指令后,(ACC)=2
如图所示,第二条指令是乘法指令:
对应上面的第⑦步,现在MDR中数(3),就会被放到MQ(乘商寄存器)中,即
MDR--->MQ 导致(MQ)=0000000000000011=3
接下来把a的值放到通用寄存器X中,即CPU执行乘商操作时,会把被乘数放到通用寄存器X中,即ACC寄存器中的数据放到X中,而乘数放到MQ中,就是下面的第10步
(ACC)--->X 导致(X)=2
接下来CU会通过控制总线告诉ALU(算术逻辑单元),让其进行乘法运算,那么ALU会将X与MQ中的数据进行相乘操作,并将最终的结果放到ACC中,如下面的11所示,即
(MQ)*(X)--->ACC 由ALU实现乘法运算,导致(ACC)=2*3=6,如果乘积太大,则需要MQ辅助存储,MQ会用来存储乘商运算结果的低位
此时ACC就存放了a*b的值了。
借这个例子就很好理解下图了:
分析完两条指令后,我们可以看到,取指令与分析指令的流程都是一样的,只有当CU分析出指令的不同功能时,操作才会产生区别,所以接下来就从CU分析指令后讲解:
第三条指令的执行:
上一条指令取指后(PC)=2,执行完上一条指令后,(ACC)=6,即ACC中存放了上一条指令执行的结果。
同理,CU分析后,得知这是一个"加法"指令。CPU将指令的地址码送到MAR(0000000111),导致(MAR)=7,即:Ad(IR)--->MAR
接着主存储器会根据MAR,到存储体中寻找对应数据,即主存地址为7的位置存放的数据,放到MDR中
M(MAR)--->MDR 导致(MDR)=0000000000000001=1
由于是"加法"指令,MDR会将数据传送到通用寄存器X中
(MDR)--->X 导致(X)=0000000000000001=1
到这一步,ACC中存放的是被加数,而X中存放的是加数,控制单元CU会向ALU发出信号,指明这是一个加法操作,那么ALU就会将ACC与X中的值相加,并且将加和的结果放到ACC中,即下面的第10步:
(ACC)+(X)--->ACC 导致(ACC)=7
此时ACC就存放了a*b+c的值了。
第四条指令的执行:
上一条指令取指后(PC)=3,执行后,(ACC)=7
由CU分析后,这是一条"存数"指令,接着IR会将该数据的地址码(0000001000)送到MAR中,导致(MAR)=0000001000=8,即:Ad(IR)--->MAR
另外ACC会通过数据总线将数据送到MDR中,即(ACC)--->MDR,导致(MDR)=7,此时MDR中存放的就是a*b+c的值了。
存放的就是a*b+c的值了。
(MAR)=8,(MDR)=7,CU通过控制总线告诉主存储器此次是一次写主存的操作,那么主存储器会根据MAR所指明的地址,把MDR中的数据放到相应的位置中,也就是将a*b+c的值7存放到主存地址为8的位置。
第五条指令的执行:
上一条指令取指后(PC)=4
CU分析后,得知这是一条"停机"指令,那么利用中断机制通知操作系统终止该进程。
总结:
根据指令周期的不同阶段(取指令,分析指令,执行指令),CPU就能区分其从主存中取出的是指令还是数据,例如"取指令阶段"就是取的指令,"执行指令阶段"就是取的数据。
6.计算机系统的多级层次结构
(1)低级语言
机器语言:
传统意义的计算机只能识别机器语言,也就是二进制表示的指令,CPU在执行二进制表示的指令时,还需要将这些机器指令细分为更细的指令执行,即微指令或微操作。也就是用微指令解释并执行每一条机器指令。
例如下图,主存地址为0的指令,就需要分为9个微操作。
汇编语言:
由于二进制指令用于编程是很不方便的,所以出现了汇编语言,使用汇编语言的程序员看到的机器就是"虚拟机器",为什么是"虚拟机器"?
因为在使用汇编语言的程序员看来,好像机器能直接识别汇编语言,但是机器其实无法直接识别汇编语言,而是需要通过汇编程序翻译成等价的机器语言程序,才可以执行。
一条汇编语言对应一条机器指令:
用汇编语言编写的程序,只是更便于理解而已,但本质上依然属于低级语言。
(2)高级语言
在程序员看来,可以识别高级语言的机器,也称为"虚拟机器",因为机器不能直接识别高级语言,高级语言需要用编译程序翻译成汇编语言程序,用汇编程序翻译成机器语言程序,机器才能识别。
(3)计算机系统的层次结构
高级语言编写的程序可能会用到操作系统提供的服务,例如通过系统调用请求操作系统的服务,汇编语言编写的程序同理,那么完善的层次如下图所示:
操作系统与操作系统之上的部分就为软件部分,用机器语言的机器及以下的部分就为硬件部分
下层是上层的基础,上层是下层的扩展。
(4)三种级别的语言
如上图所示,高级语言需要用编译程序翻译成汇编语言程序,用汇编程序翻译成机器语言程序,机器才能识别。事实上也有一些语言,经过编译程序的编译后,就能直接得到机器可识别的机器语言程序。
还有一些高级语言的执行,并不是通过编译程序编译,而是通过解释程序,将高级语言翻译为对应的机器语言指令,例如:JavaScript、Python、Shell
编译程序与解释程序的区别:
编译程序:将高级语言编写的源程序全部语句一次全部翻译成机器语言程序,而后再执行机器语言程序(只需翻译一次),例如执行完C语言后生成的.exe文件,这个文件就是用机器语言描述的
程序,只要生成这一文件,之后就不需要再进行编译了。
若要运行这一程序,只需要加载这一文件即可。
解释程序:将源程序的一条语句翻译成对应于机器语言的语句,并立即执行。紧接着再翻译下一句(每次执行都要翻译)
所以编译程序执行效率更高,解释程序执行效率较低。
注:编译、汇编、解释程序,可统称“翻译程序”,他们的作用都是将更高级的语言翻译为更低级的语言。
补充:计算机体系结构与计算机组成原理的区别
计算机体系结构探讨的是如何设计硬件与软件之间的接口。而计算机组成原理探讨的是如何用硬件实现所定义的接口。这对程序员来说是“透明”的,即程序员是看不见的。