存储器读取
如果要让计算器自动取数,然后计算:10+5+7+2+6。我们先把要加的数都写入存储器,然后再一个一个取出来相加。如果没有特殊的原因,所有的二进制数都应该从存储器的顶端,也就是地址0000开始一个挨着一个存放。
如下图,假设存储器里已经存放了我们要加起来的5个二进制数;
AC是计数器,用以提供访问存储器的地址,所以称为地址计数器。一开始它的内容时0000,每按一次KAC,它就在原来的基础上自动加一,以得到访问下一个存储器单元所需要的地址;
AR是一个寄存器,用来临时存放存储器地址,称为地址寄存器。看起来AR有些多余,似乎用AC给存储器提供地址更直接。但是你很快就会发现,不把计数器AC直接和存储器相连,而是由AR负责转交是非常有道理的。
KRD的作用是给存储器发送命令,要求它将数据送出。注意存储器的W端没有使用,因为我们现在只是要读,所以将它悬空,让它一直为0。
数据寄存器DR永远暂存读出的数据。
在介绍存储器取数过程前,先把地址计数器AC清零,以指向地址0000,然后执行下面的操作:
(1)按下KAR,地址计数器AC当前的值0000被AR锁存,并提供给存储器。
(2)先按住KRD,不要松开,再按一下KDR;这时,数据送出,并被DR保存;最后,松开KRD;
(3)按一下KAC,地址计数器加一以指向下一个地址,为再次从存储器里读数据做准备。
至此,存储器里的第一个数就被取出来了。如果要接着取第二个数、第三个数,重复上面的三个操作步骤即可。
半自动化
我们的目标是用机器计算一连串的加法:10+5+7+2+6,我们想通过存储器把所有要相加的数都提前保存起来,然后,我们什么也不动,就坐在那里看机器中地把它们取出来相加。现在,存储器和加法器可以合在一起,以实现从存储器里不断取数、然后相加的功能。
冯洛伊曼认为,存储器里不但要有纯粹的数字,还应当有一些指示如何加工这些数字的指令。在《计算机与人脑》这本书里,他写到:”一条指令,在物理意义上和一个数是相同的。“换句话说,它们躺在存储器里,很像普通的二进制数,但实际上不是。
如下图,所有的指令都以一个操作码开始,它指示出该指令的功能。比如,可以用10001表示”装载“,用10010表示”相加“。
除此之外,操作码还隐含了一些别的意思。比如装载指令,往哪里装载呢?而且,装载谁能?这个数字在哪里?相应的,相加指令的操作码10010则隐含了更多的意思。首先,它指出,第一个相加的数字位于寄存器RA;第二个相加的数字位于下一个存储单元;最后,相加的结果还要保存在寄存器RA里。
假设这台机器刚刚通电启动。随着开关K的按动,在t0~t2阶段,第一个存储单元(地址0000)里的操作代码被取出,地址计数器AC自动加一。这个阶段,称为取指令阶段。
现在,第一条指令的操作码已经位于寄存器DR中。在t3阶段,IIR产生一个上升沿,使得寄存器IR将代码保存起来。IR是一个普通的寄存器,但专门用来临时保存指令,所以称为指令寄存器。
IR的输出直接通向译码电路EC,EC的任务是翻译当前指令。当它的输入时10001时,I装载=1,I相加=0;相反如果输入10010,则I装载=0,I相加=1。而对于其余任何输入,I装载和I相加都为0。所以,t3称为指令译码阶段。
注意,I装载和I相加对t0~t3阶段没有影响,不管它们两个输入的是什么,机器所指向的都是取指令和翻译指令。
因为第一条指令时装载指令,所以I装载=1而I相加=0,于是t4~t8阶段,将依次指向下面的任务:从下一个存储单元里取数、地址计数器AC加一、把取出来的数装载到寄存器RA中。
至此,第一条指令执行完毕,循环移位寄存器RR已经经历了一次完整的循环移位。
在第二个t0~t3阶段,将取出第二条指令(相加指令)并进行译码,使得I装载=0,I相加=1。于是,在第二个t4到t8阶段,将再次取数,并与RA中的数相加(结果依然返回RA中)。
基本上,这台机器的工作过程就是这样。你可以继续按动开关K,直到所有的指令都执行完毕。
全自动化
为了执行每条指令,你唯一的工作就是不停的按动那个开关。当我们用手工来产生类似于振荡器的脉冲式,一切都是可以控制的,主要是脉冲次数。如果使用振荡器,你将不知道机器在工作的时候已经经历了多少个脉冲。当所有的数都已经加完之后,振荡器必须恰到好处地停下来。
为了获得使用振荡器带来的好处而使得它处于可控的状态,需要做几个方面的改进工作。
首先,必须为这台机器增加一个新的指令,即停机指令,比如1111,并把它放到其他所有指令的后面。不像我们已知的其他指令,它只有操作码而没有操作数。
其次,重新设计译码电路EC,使得它除了可以译出装载和相加外,还能译出停机。
显然,我们重新设计了指令译码电路EC,使得它可以译出I停机。平时IHLT=1,震荡器的脉冲可以顺利通过与门。一旦执行了停机指令,则I停机=1,这直接导致IHLT=0,于是不再有振荡器脉冲到达控制器,控制器停止工作。整个机器也就休息。
计算机要想可靠地工作,指令的正确性至关重要。在存储器里,指令和普通的二进制数没有区别,但它们却有着独特的含义和用途。指令的数量是有限的,所以并非任意一个二进制比特串都代表一条指令。比如,1000100100可能是某天计算机的一条指令,但1000011110则可能不是。如果计算机执行了并非指令的“指令”,指令译码器将不能输出正确的信号给控制器,整个计算机业就瘫痪了。
所有指令在存储器中的布置都是精心的,绝对不能错乱。当一条指令执行完后,紧接着,控制器取出的应当是另一条指令。不过,由于不同的原因,存储器中本应该是另一条指令的地方恰恰是另一个普通的二进制数,而非一条指令。计算机执行的非计算机指令称为非法指令。在早期,执行一条非法指令会引起我们通常所说的“死机”现象,因为控制器不知道该如何发出一系列控制器信号来协调各个部件的动作,而现代的计算机则会自动从这种不正常的状态中恢复过来。