计算机技术的实现是人类思维的产物,实际上是人类以自己的思维方式为蓝本设计出来的一种模拟机,因此远在工业革命以前,人们就已经在思想上进行了极为类似的的模拟实验,这些可以从我们熟知的一个经典的故事中找出。
三国时期孙权和刘备为联合抗击曹操,约定刘备可暂时作为荆州地区的行政官全权管理该地区的事物。在赤壁大战击败曹操后,孙权一直向刘备索要荆州,而刘备则寻找各种借口就是不还。吴国大将军周瑜在得知刘备的妻子甘夫人病故后心生一计,在征得孙权的同意后,便派人前往刘备处,表示孙权想将自己的妹妹孙尚香嫁予刘备,条件是刘备须到吴国完婚。周瑜计划等刘备到吴国后扣押刘备,然后以此要挟刘备索回荆州的管辖权。
刘备的军师诸葛亮在获悉全部情况后,便劝刘备前往结亲,并派得力干将赵云带500军士随
行。行前诸葛亮交给赵云3个锦囊,并告知3个锦囊里有3条指令,其中第一个在一到吴国的地盘南徐(地名)时打开,第二个是刘备在吴国住到年终时打开,第三个是在情况紧急时打开。
一到吴国属地,刘备就感到极其不安,于是赵云便取出第一个锦囊,指令告诉赵云,让他命令大部分军士全部到集市购买各种礼物,并散布刘备将要与孙权妹妹结亲的消息。而刘备自己则和赵云带上礼物一同去拜访孙权母亲的亲家乔国老,通报刘备将要迎娶孙尚香的消息。
这样由军士散布市井消息,又由乔国老通知孙权的母亲吴国太,于是刘备要娶孙权妹妹的消息全吴国都知道了。在此情况下,再扣押刘备于情于理都说不过去,所以孙权也只好把妹妹嫁给刘备。
只要刘备还呆在吴国,索要荆州的希望仍然是很大的。刘备一生四处颠簸几乎没过过什么安逸的生活,而吴国生活富裕风景优美,新婚的刘备居然乐不思蜀不提回荆州的事了。此时已到年终,赵云只好拿出第二个锦囊取出第二条指令。赵云按指令要求,报告刘备说诸葛军师送来急报曹操军队正在攻打荆州让刘备火速赶回。刘备一听马上说服新婚妻子孙尚香随他一起立即赶回荆州,连给母亲哥哥辞行的礼节也都免了。
周瑜得知刘备不辞而别赶往荆州的行动后,立即派将领兵堵截。在无法脱身时赵云取出第三个锦囊,第三条指令要刘备对妻子哭诉周瑜有意害他,全然不顾孙尚香的公主身份等等。弄得公主怒气冲天,便以吴国公主的身份上前斥责挡路的将领。碍于公主的身份,吴国将领只好让道。等吴国老大孙权亲自下令堵截时,刘备已经跑出了吴国能够控制局面的范围。
这个故事是一个非常典型的程序化工作方式,历史上是否真的发生过并不重要。重要的是早在明朝三国演义作者的罗贯中就已经设想过程序的工作方式了,并在写作中体验了一下编程序的味道。
全面而仔细地讨论这个经典故事,不但能使我们理解计算机的工作方式,且对我们理解计算机的结构也会有莫大的帮助。
在前面的故事中诸葛亮不是一次就给赵云交待所有事情,而是给3个锦囊并要求一次只能打
开一个很可能是有其原因的,但这不在本书的讨论范围。我们可以将此理解为诸葛亮此次把赵云的任务做了程序化处理,“一次只能知道和处理一条命令”。这是计算机程序工作的重要特点,计算机一次只能处理一条指令。
程序工作的第二个重要特点是有“前后顺序”,不能出错,假如赵云在第一次开锦囊的时候不小心错拿顺序排在第二个的锦囊,那么刘备马上就打道回府了,此次任务马上以失败告终。如果赵云在该拿出第二个锦囊时误拿了第三个并执行,那不但会使任务失败,很可能刘备的性命都不保,所以严格的顺序是程序工作的另一个重要特点。
诸葛亮之所以敢于写下3条命令后让刘备和赵云前往吴国,其原因在于他对将要发生的情况一清二楚,也就是说他“对将要发生的事情已经预知在先”,这是程序工作的唯一要素。程序员是在他(或她)知道将要处理的所有事情之后,才能编写出可以完成工作的程序。如果发生了程序员没有预计到的情况,程序员是不会处理的。
假如周瑜在刘备一到南徐就把他扣下,那故事的结局就完全不同了。但诸葛亮笃定这种事情不会发生,因此不会给出相关的指令。
从上面的讨论中我们知道了计算机的工作特点和编程要素,那么使用电子技术的计算机CPU需要什么样的结构和指令系统才能工作呢?
只要对上面的故事细节进行深入的对比思考,我们就会很容易了解到CPU为什么会有现在这样的结构,以及需要那些指令才能完成“计算”任务。
先比较一下程序化了的赵云与由电子技术构成的CPU系统之间的4个差别:
(1) 信号系统:赵云是个活人,主要有三种信号起作用,即视觉、听觉和触觉。而计算机系统只有一种信号系统,即电平的高和低(0和1);
(2) 解码方式:赵云有复杂的语言能力,加上能阅读文字,因此解码能力超强,诸葛亮只须将复杂任务写在字条上,赵云就能理解并完成。而CPU是机器属性,只能通过对电平信号组的硬性规定来选择相应的功能电路(在技术上称为译码电路)来完成极其简单的指令,和人们使用的文字语言相比,计算机的指令少得可怜,通常在三十多条至一百多条之间,功能也极其简单,因此程序员常常为完成一个简单的任务需要写上许多条指令;
(3) 执行指令的间隔:赵云拆开锦囊的时间没有明确的规定,诸葛亮只告知拆锦囊时的必要条件,指令间隔内其它事情如刘备的起居饮食安全保卫等一律由赵云自己处理,不需要下达特别的指令。而CPU靠系统提供的时钟频率运行,指令的时间间隔非常精确,只要提供系统电力它便不停地运行,即使在看起来没有处理任何事物时也不会停止执行指令操作。CPU系统不能自己处理任何事,它所做的每一件事情都必须在程序员的指令下完成,甚至包括等待任务的待机方式,都由程序员编写的指令完成;
(4) 工作形式:赵云能够自行处理和完成一般活动中的所有事情,这些不用诸葛亮操心。 但有一个缺点就是需要休息。而CPU系统虽然缺心眼,所有事情都必须由程序员预先编写好程序,但只要维持电力供应就可以不停地运作,这是它比人优越的唯一点。
通过以上比较可以看出,计算机技术只能在机器属性限制的条件下对人的模拟,为方便讨论,先委屈一下英勇神武的赵云先生,将他设想成一个不那么聪明能干的人,他的所有事情都需要诸葛亮事先用锦囊安排好。这样要使赵云完成任务就需要诸葛亮给赵云准备装有大量锦囊的指令,由于指令的顺序不能有错误,所以还必须给所有锦囊编上顺序号码,为了防止锦囊丢失,诸葛亮还必须准备一个专门的器具,这个专门用来放置锦囊的器具相对CPU系统来说就是程序存储器,前面讲过的存储器是由许多存放数据的“房间”组成的,我们可以先将每个房间理解成一个“锦囊”,这样CPU可以通过给存储器的地址线输出地址信号,读到每个“锦囊”的内容。所以CPU自身有一个程序计数器,程序计数器的输出端对接程序存储器。计数器的工作方式是每输入一个计数脉冲其计数输出+1,所以CPU每完成一步操作就会让程序计数器+1,自动寻址到下一个锦囊的地址。
存放和按顺序寻找锦囊的问题解决了,下一步就是读取和解码指令的问题。赵云并不是随时都可以读取锦囊指令的,比如在骑马奔驰的时候、天黑看不清的时候或者有其他人干扰的时候。赵云读取指令必须进入一个能够取出锦囊字条并安心阅读的条件环境。CPU也一样,它需要先将指令取到一个叫做“指令暂存器”的地方进行译码处理。由于译码器的具体操作需要在讲解CPU的机器指令集时才能完全搞清楚,所以本节只需将它理解成可以将指令翻译的并启动执行的部件就可以了。实际上CPU的每一个功能操作都需要一个相应的“暂存器”,后面的章节将会结合指令集进行详细的介绍。
最后需要做的就是指令的实现与执行,赵云要执行指令就要运动他的执行机构——身体,所以CPU要执行指令也需要动用它的执行机构——总线(即地址、数据、控制三总线)。这里初学者往往会感到十分困惑,总线不是用于指令的读取和排序的吗?怎么又变成执行机构了呢?
先不妨看一下赵云的主要执行机构:双手,赵云要从锦囊里取字条,这时他的双手用于取指,如果指令要求他拿起兵器去巡逻,他的双手就要去拿上兵器并要操作马匹或马车等交通工具,赵云双手是通用和多功能的。CPU的总线也是一样的,除了完成取指操作外还能完成指令的执行,它也是通用和多功能的。赵云作战需要配置用于战斗的专用兵器,CPU的总线为完成专门任务也需要配置专门的工作硬件。赵云在不需要战斗时把兵器丢在一边,CPU也只是在需要操作时才通过总线来操作这些硬件,平时也会将它丢在一边不予理会。
通过上面的对比讨论,我们知道了CPU系统主要由3个部分构成的,即:指令读取、指
令译码和指令执行。下面将讨论CPU到底需要什么样的指令系统才能工作?
上面介绍了CPU的基本结构,那么在此结构基础上的CPU系统到底需要配套什么样的指
令系统,才能达到根据命令完成多样任务呢?
有一句老话叫“人为财死,鸟为食亡”。虽然此话有点消极,但确实是对大量人的行为进行抽象后的总结,人和动物的行为其实可以简单地总结为目标——计算——行动这3个不同的功能部分。比如小鸟发现了食物,它会先查看一下环境(数据采集),然后根据收集到的环境信息判断是否会有风险或对风险的大小进行权衡(算术或逻辑运算),然后根据权衡(运算)的结果决定是否靠近食物(行动)。
因此只要按照上述3种功能来组成CPU系统的指令系统就可以完成机器对人的模拟,我们学习的CPU系统,正是由这3类指令组成的,它们分别为:数据传送指令、数据运算指令和控制转移指令。下面分别介绍这3类类指令的功能和作用。
传送指令:传送指令是最重要也最容易被忽视的一类指令,通过上节的学习,我们知道CPU为了能够完成取指和译码等操作,需要配备许多相对应的硬件电路才能完成。这些电路之间的数据传送,以及外部数据与CPU内部各电路之间的数据传送,都可以被归结为传送指令。就象人和动物的感觉器官的信息都要传送到大脑处理一样,没有传送指令就不可能有运算的结果,而且运算结果的执行依然要通过传送指令传送到相应的操作单元。
运算指令:运算指令是最容易理解的指令,因为CPU所处理的都是数字,因此它的数据运算也只需要算术运算指令和逻辑运算指令就足够了,但对于运算结果的处理,则必须通过控制转移才能实现。
控制转移指令:对于初学者来讲,控制转移指令是一种全新的概念,所以这里要特别强调一下。要理解这类指令首先必须知道“分支”的概念,当我们在一条笔直的大路上行走时,如果出现了一个路口,这时是继续沿着原来的路走下去还是拐进新出现的路口就需要做一个决定,这就是“分支”的概念。走路时如何分支,则要看我们达到的目标在哪里,对CPU的程序来讲问题也是一样的。前面已经介绍过CPU每次读取并执行一条指令,完毕后再读取下一条指令并执行。为使CPU按程序员的要求进行工作,我们就必须为CPU准备很长很长的一大串指令,这些指令串就是我们通常所说的程序。和城市的道路一样,我们给CPU下达的指令串也不可能是一条直线走到头,和道路情况一样指令串也有许多分支。控制转移指令就像路口的指示灯,决定程序在“分支”的路口执行相应的指令串。