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