计算机组成
2 计算机基本结构
2.5 计算机执行指令的过程
执行指令是计算机过程的核心,理解了指令如何执行,也就把握住了计算机运行原理的关键。在这一节,我们就一起来看这个模型机是如何执行指令的。
现在我们已经有了这样一个模型。
而且我们也知道了计算机执行一条指令的主要步骤,包括取指、译码、执行、回写。
那我们就想在这个模型机上尝试执行一条计算机的指令。这里给出了一个例子,我们想执行的这条指令是“ADD R0, [6]”,这样的一个指令格式代表什么含义呢?从ADD,我应该能看出来这是一条加法指令。那么这个加法应该有两个原操作数,其中一个就是通用寄存器R0的内容;另一个[6],中括号就代表是存储单元的内容。那么,中括号里面带一个6说明是地址为6的存储单元的内容。我们把这两个原操作数相加,就可以得到一个运算结果。那么,在我们这种格式指令当中,默认第一个操作数即是原操作数又是目的操作的。这个运算结果就会更新到通用寄存器R0中。现在我们就来看这条指令是如何在模型机上执行的。
假设模型机的当前状态已经有了一些初始值。我们需要注意的是CPU中的R0所保存的值是0000 0011,这等于10进制的3。而存储单元地址为 6(0110) 的存储单元的内容是 0000 0010,相当于10进制的2。那么我们所要做的,就是把这个存储单元地址为6中的数2和R0当中的数3相加,最后再放到R0中。我们还看到 PC 寄存器也就是指向下一条指令地址的寄存器,保存的值是 0001,那么,它所指向的内层单元的地址是 0001,所以这个内存单元中其实是保存了当前所需要执行的那条指令,我就用 1010 1010 这么一个值来指代,这仅仅是指代而已,那我们就来看在这个模型机上是如何运行的。
指令执行的第一步,取指。取指这一步所要做的是控制器将指令的地址送往存储器,存储器按给定的地址读出指令内容,送回控制器。那我们来看具体的操作步骤。
首先请注意控制器会发出控制信号将PC寄存器中的内容通过内部总线传送到MAR中。好,现在MAR寄存器中也保存了0001。
下一步,MAR将会把这个地址送到地址总线上,与此同时,控制电路会在控制总线上发出相应的控制信号,代表这次访问存储器的操作是要读数据。
这样存储器的MAR寄存器就会收到地址总线上传送来的地址并把它保存下来。存储器中的控制逻辑,也会受到控制总线中传送来的控制信号,得知这次仿真操作是一次读操作。
这样存储器通过地址译码器就可以查找到对应地址0001的存储单元的内容,并将该存储单元的内容送到MDR寄存器中。
然后存储器的控制逻辑,会通过控制总线向CPU反馈当前的传输已经准备好了,同时,MDR之中的内容也会送数据总线上。随后,CPU中的控制电路检测到来自控制总线的准备好的ready信号,就知道当前数据总线上已经准备好了数据。
因此,MDR寄存器就会将当前数据总线上传送来的数值保存下来,这就获得了我们所要取的指令。当然,仅到如此是不够的。
MDR中的内容还必需要传送到指令寄存器中,也就是IR寄存器。当指令的编码已经保存到IR寄存器中时,取指这部分工作就已经完成了。真的已经完成了吗?请再仔细想一想。
其实我们还需要再做一件事,就是把PC寄存器更新为下一条指令所需要访问的地址。刚才是0001,现在变成0010,也就是10进制的2。更新完以后我们才可以做下一步的工作。那么,取指阶段到此正式完成。
第二步是译码。这一步控制器会分析指令的操作性质,并向相关的部件发出指令所需的控制信号。
当前的指令计算器IR中指令编码会送到指令译码部件。
指令译码部件根据指令编码,很快会发现这是一条加法指令。而且,是要把R0和存储器中地址为6的单元的内容相加,并把结果存放到R0中。然後,控制电路就据此产生对应的控制信号,并发到相关部件中。这样译码阶段就到此完成了。
第三步是执行。控制器会从通用寄存器或者存储器中取出操作数,并命令运算器对操作数进行指令规定的运算。
首先,根据这条指令我们会发现,还需要去取操作数,其中一个操作数在存储器里中。因此,这一步会在MAR中放置要访问的存储器的地址 0110,就是10进制的6。
那么,随后的过程类似于取指阶段的操作。MAR将地址 0110 发到地址总线。同时,控制电路在控制总线发出读操作的控制信号,存储器的MAR控制逻辑会接收到相应的信号,然后查找到对应的地址,这次要查找的地址是0110,对应的内容 0000 0010 会送到MDR这个寄存器。然後,控制逻辑会向CPU反馈当前数据已经准备好了的信号。然後,MDR的内容也会被放置到数据总线上,CPU会接收数据并保存在MDR寄存器中。
因为这个数据要进行加法运算,所以控制器会进一步将MDR中的数据传送到ALU的输入,目前会暂存到Y寄存器中,这一个操作数现在就准备好了。那么另一个操作数是放在R0中,因此,控制器还会将R0中的数据传送到ALU的另一个输入端,也就是X寄存器。
现在,两个操作数都准备好了。在控制电路的控制下ALU就会进行运算,将X、Y中的内容执行加法并计算出结果。结果就是 0000 0101 也就是10进制的5。到此,执行阶段就完成了。
第四步是回写。也就是将运算结果写入到通用寄存器或者储存器。
现在,运算结果还在ALU的输出端,也就是Z寄存器中。控制电路会给出相应的控制信号,将Z寄存器当中的内容传送到R0中。R0目前的内容是之前的原操作数,也就是 0000 0011。随后会被新的结果(Z寄存器中的内容)所覆盖。
这样,我们这个加法运算的结果就已经保存到了R0寄存器中。回写阶段到此完成。这条指令你就执行完毕了。
然後,CPU就会自动执行下一条指令,和刚才一样,先将PC中的内容传送到MAR寄存器当中,然後MAR会将这个地址传送到地址总线上,依次的执行下一条指令。
现在,我们通过学习计算机是如何执行指令,已经掌握了冯·诺伊曼结构的核心内容。但是,人们是如何向计算机下达指令的呢?计算机的运行结果又是如何让外界得知?这是我们下一节将关注的内容。