2.2.7 指令在计算机中的执行
与一般的家用电器不同,计算机是一种通用的机器。家用电器功能一般比较单一,而计算机却可以根据用户要求完成各种不同性质的任务。为什么计算机具有这种能力?原因在于程序员可以通过编写程序的方式来扩展计算机的能力。正如前文所述,每种类型的计算机都提供一套指令系统,程序员可以利用指令系统中提供的指令编写完成特定任务的程序,而所谓程序就是由程序员编写的能在计算机上执行的完成某个任务的指令序列。计算机顺序执行程序员编写的指令序列,就完成了某个特定的任务。
在现代计算机中,程序在执行前,首先都要存储在计算机的存储器中,然后再由CPU读取并执行;在计算机发展的早期阶段,程序在执行前并不存储在存储器中。把程序和其处理的数据同样对待,存储在存储器中,这一思想最早是由冯·诺伊曼提出的,相关思想通常被称做存储程序原理。目前所有计算机都采用存储程序原理;也就是说,所有程序在执行前都必须首先装入计算机的存储器中。
为了更好地理解程序及其在计算机中的执行过程,我们看一段简单的程序。该程序从输入设备读入两个数,进行相加操作,并把结果通过输出设备输出。假定输入设备的编号是1,输出设备的编号是2。下面为完成相应功能的指令序列:
IN [0],1
IN [1],1
MOV A, [0]
ADD A, [1]
MOV [2], A
OUT[2],2
该程序由六条指令组成。首先,两条IN指令分别从1号设备完成两个数的输入,输入后的数被分别存储在存储器中0,1号存储单元中。接下来,MOV指令把0号单元中的数据传送到CPU的寄存器A中;ADD指令把寄存器A中的数与1号存储单元中的数据相加并把结果寄存在寄存器A中,随后的MOV指令再把运算结果从寄存器A中传送到2号存储单元中存储。最后,OUT指令把保存在第2号存储单元运算结果通过2号设备输出。现在假定该程序存放在存储器中从第100号开始的存储单元中,为了简单起见,假定一个存储单元可以存放一条指令,则上述程序被存储在存储器中第100~105号存储单元中,改写如下:
100: IN [0],1
101: IN [1],1
102: MOV A, [0]
103: ADD A, [1]
104: MOV [2], A
105: OUT[2],2
那么,上述程序如何在计算机中执行呢?事实上,一打开电源,计算机始终处在一个“取出指令—执行指令”的循环过程中。CPU首先从存储器中取出一条指令,然后对该指令解码,并控制计算机的其他部件执行该指令。一条指令执行完后,CPU会从存储器中取出下一条要执行的指令,再解码、执行。如此反复,直到计算机电源关闭。对上述程序而言,CPU首先从存储器中的100号存储单元取出第一条输入指令,并把该指令寄存在CPU的指令寄存器中,进行译码,并启动控制电路执行。指令执行完后,CPU再从101号存储单元中取出下一条指令并译码、执行。如此继续,直到程序中的所有指令被取出、执行。CPU根据程序计数器中的内容确定到哪个存储单元读取指令。在上述程序开始执行时,程序计数器中的内容是100,即CPU需要到第100号存储单元中读取要执行的指令。在第一条指令执行完成后,指令计数器的内容会自动累加为101,这意味着CPU下一条要读取的指令位于101号存储单元中。通过程序计数器的自动累加,CPU就可以逐条读入组成程序的指令并完成程序的执行。
我们以上述程序中的相加指令为例,说明指令在计算机中的执行过程。CPU先在102号存储单元中读取指令;再通过总线将该指令传送到CPU中的指令寄存器中,同时程序计数器中的内容累加为103,为读取下条指令做好准备。图2-6是指令读取过程的示意图,图中虚线标记了指令通过总线到达指令寄存器的过程。
图2-6 指令的读取过程
当把指令读入指令寄存器后,CPU即开始执行该指令,图2-7显示了指令ADD A, [1]的执行过程。不太严格地说,该指令的执行可以分做五步:①指令译码器对指令寄存器中的指令进行译码,并驱动控制电路发出控制信号,引导指令的执行;② 在控制电路的驱动下,寄存器A中的数被读入到算术逻辑运算单元;③ 在控制电路的驱动下,第1号存储单元中的数据通过总线传送到ALU; ④控制电路驱动ALU进行加法运算;⑤ ALU的运算结果被传送到寄存器A中,取代了A中原有的内容。
图2-7 指令的执行过程