本节我们学习了控制计算机跳转指令的第三个发明的由来,以及清除指令。并且展示了计算机的整体控制部分的布线图。
第三个发明
对于跳转指令,有时它会跳转,有时不会。跳或不跳只是两种可能性,所以只需要一个bit就可以确定哪一种会发生。计算机的第三个伟大发明,是用来确定这个bit的。
还记得我们之前讲过的ALU部件的“进位”吗?加法或者移位会产生这个“进位”。另外有个bit告诉我们两个输入是否相等,一个bit告诉我们a输入是否较大,还有一个bit告诉我们ALU的输出是否全为零。这些bit的使用是我们还没有提及的东西。这四位将被称为“标志”位,它们将用于决定“Jump If”指令是执行RAM中的下一条指令还是跳转到其他地址。
我们试图让计算机完成的是,首先执行一条ALU指令,然后有一条或多条“Jump If”指令。“Jump If”将根据ALU指令期间发生的情况跳转或不跳转.
当然,当“Jump If”执行时,ALU指令的结果早已消失。如果你回过头来看ALU指令的细节,只有在步骤5中,所有正确的输入才会进入ALU,并且得到想要的答案。此时,答案被设置为ACC。所有四个标志位的开启时间相同,它们仅在ALU指令的步骤5期间有效。因此,我们需要一种方法将标志位的状态保存为ALU指令步骤5期间的状态。
这是我们要添加到CPU的最后一个寄存器。这将被称为FLAG寄存器,我们将只使用其中的四位,每个标志一个。来自ALU的标志位连接到该寄存器的输入端,它将在ALU指令的第5步期间被设置,就像ACC一样,它将一直保持设置状态,直到下一次执行ALU指令。因此,如果有一条ALU指令后跟一条“Jump If”指令,“标志”位可以用来“决定”是否跳转。
每个指令周期都使用步骤1中的ALU向下一条指令的地址加1,但只有ALU指令的步骤5有设置标志的连接。(我们没有在ALU指令的布线中显示这种连接,因为我们还没有引入Flag Reg,但它将出现在完整的控制部分图中。)Flag位和Jump IF指令的组合是第三个也是最后一个伟大的发明,使我们今天所知的计算机能够工作。
这是“Jump If”指令的指令代码。指令的后四位告诉CPU应该检查哪个标志。在与要测试的标志相对应的指令位中输入“1”。如果您测试的任何一个标志打开,则跳转将发生。这种安排为我们提供了许多决定是否跳的方法。如果跳转被执行,则有第二个字节包含要跳转到的地址
这是控制部分的接线,使跳转指令起作用。
第4步将IAR移动到MAR,因此我们准备好获得“跳转到地址”,如果我们跳转,我们将使用它。但因为我们可能不会跳转,我们还需要计算RAM中下一条指令的地址。因此,步骤4也打开总线1并在ACC中设置答案。
在步骤5中,我们将ACC移动到IAR,这样我们就可以在不跳转的情况下获取下一条指令。
第6步是做出“决定”的地方。如果AND门的第三个输入打开,我们将把指令的第二个字节从RAM移到IAR。第三个输出来自有四个输入的OR门。这四个输入来自与IR中的Jump If指令的最后四位进行AND运算后的四个Flag位。例如,如果指令的“等于”位中有“1”,并且“等于”标志位处于启用状态,则跳转将发生。
这里有更多关于我们计算机语言的单词。”“J”表示跳跃,“C”表示进位,“A”表示A较大,“E”表示A等于B,“Z”表示答案全部为零。下面是测试单个Flag的语言
您还可以通过在四个位中的多个位中输入1来同时测试多个标志位。实际上,由于有四个位,所以有16种可能的组合,但四个位都关闭的组合没有用,因为它永远不会跳。为了完整起见,以下是其余的可能性。
清除标志指令
当进行加法或者移位时候,我们有可能通过操作打开进位标志。但会出现的问题是,如果您只是添加两个单字节数字,那么您不关心任何先前的进位,但进位标志可能仍然是从先前的操作中设置的。在这种情况下,你可以加上2+2,得到5!
因此,我们需要一个清除标志指令,在出现意外进位问题的任何加法或移位之前使用该指令。这是此指令的指令代码。不使用第4、5、6,7的bit位。
这条线路非常简单,也有点棘手。我们不会在总线上启用任何东西,因此它和“A”ALU输入将全部为零。我们将打开“总线1”,因此“B”输入为0000 0001。我们不会向ALU发送操作,因此它将处于ADD模式。因此,ALU将0和1相加,可能存在进位输入。然后答案将是0000 0001或0000 0010。但不会有进位输出,答案不是零,B大于A,因此“等于”和“大于A”都将关闭。此时,当所有四个标志位都关闭时,我们“设置”标志寄存器
对应的计算机语言:
计算机的整体控制部分
我们现在已经连接了CPU的控制部分。因此,我们可以在RAM中放置一系列指令,时钟、步进器、指令寄存器和连线将获取并执行这些指令。以下是整个控制部分:
这看起来很复杂,但是我们前面已经拆分见过了它的所有子部分。因为大多数“enable”和“set”需要多个连接,所以还需要添加一些或门。这实际比RAM部件少很多,但重复性要更大。比较混乱的地方是接线。
我们前面介绍的导致某个活动发生的是放在指令寄存器的指令代码,另外一个名称是“机器语言”,这是计算机理解的唯一语言(代码)。下面是所有指令代码和机器语言,我们在计算机上的所有操作都只是CPU执行一系列指令的结果。