1.1.3 程序和指令的执行过程
冯·诺依曼结构计算机的功能通过执行程序实现,程序的执行过程就是所包含的指令的执行过程。
指令(instruction)是用0和1表示的一串0/1序列,用来指示CPU完成一个特定的原子操作。例如:取数指令(load)从主存单元中取出数据并把该数据存放到通用寄存器中;存数指令(store)将通用寄存器的内容写入主存单元;加法指令(add)将两个通用寄存器的内容相加后送入结果寄存器;传送指令(mov)将一个通用寄存器的内容传送到另一个通用寄存器;等等。
指令通常被划分为若干个字段,有操作码、地址码等字段。操作码字段指出指令的操作类型,如取数、存数、加、减、传送、跳转等;地址码字段指出指令所处理的操作数的地址,如寄存器编号、主存单元编号等。
下面用一个简单的例子,说明在图1.1所示的模型机上程序和指令的执行过程。
假定图1.1所示模型机字长为8位;有4个通用寄存器r0~r3,编号为0~3;有16个主存单元,编号为0~15。每个主存单元和CPU中的ALU、通用寄存器、IR、MDR的宽度都是8位,PC和MAR的宽度都是4位;连接CPU和主存的总线中有4位地址线、8位数据线和若干位控制线(包括读/写命令线)。该模型机采用8位定长指令字,即每条指令有8位。指令格式有R型和M型两种,如图1.2所示。
图1.2 定长指令字格式
在图1.2中,op为操作码字段,R型指令的op为0000和0001时,分别定义为寄存器间传送(mov)和加(add)操作,M型指令的op为1110和1111时,分别定义为取数(load)和存数(store)操作;rs和rt为通用寄存器编号;addr为主存单元地址。
在图1.2中,R[r]表示编号为r的通用寄存器中的内容,M[addr]表示地址为addr的主存单元的内容,“←”表示从右向左传送数据。指令1110 0110的功能为R[0]←M[0110],表示将6号主存单元(地址为0110)中的内容取到0号寄存器;指令00010001的功能为R[0]←R[0]+R[1],表示将0号和1号寄存器中内容相加的结果送到0号寄存器。
若在该模型机上实现“z=x+y;”,x和y分别存放在主存5号和6号单元中,结果z存放在7号单元中,则相应程序在主存单元中的初始内容如图1.3所示。
图1.3 实现z=x+y的程序在主存部分单元中的初始内容
“存储程序”工作方式规定,程序执行前,需先将程序包含的指令和数据送入主存,一旦启动程序执行,则计算机必须能够在不需操作人员干预下自动完成逐条指令的取出和执行任务。如图1.4所示,一个程序的执行就是周而复始地逐条执行指令的过程。每条指令的执行过程包括:从主存取指令、对指令进行译码、PC增量(图1.4中的PC+“1”表示PC的内容加上当前指令的长度)、取操作数并执行、将结果送到主存或寄存器保存。
图1.4 程序执行过程
程序执行前,首先将程序的起始地址存放在PC中,取指令时,将PC的内容作为地址访问主存。每条指令执行过程中,都需要计算下一条将要执行指令的主存地址,并送到PC中。若当前指令为顺序型指令,则下一条指令地址为PC的内容加上当前指令的长度;若当前指令为跳转型指令,则下一条指令地址为指令中指定的目标地址。当前指令执行完后,根据PC的值到主存中取到的是下一条将要执行的指令,因而计算机能够周而复始地自动取出并执行一条条指令。
对于图1.3中的程序,程序首地址(即指令I1所在地址)为0,因此,程序开始执行时,PC的内容为0000。根据程序执行流程,该程序运行过程中所执行的指令顺序为I1→I2→I3→I4→I5。每条指令在图1.1所示模型机中的执行过程及结果如图1.5所示。
图1.5 实现z=x+y功能的每条指令的执行过程
如图1.5所示,在图1.1的模型机中执行指令I1的过程如下:指令I1存放在第0单元,故取指令操作为IR←M[0000],表示将主存0单元中的内容取到指令寄存器IR中,故取指令阶段结束时,IR中的内容为1110 0110;然后,将高4位1110(op字段)送到控制器进行指令译码;同时控制PC进行“+1”操作,PC中内容变为0001;因为是取数指令,所以控制器产生“主存读”控制信号Read,在取数和执行阶段将Read信号送到控制线,将指令后4位的0110(addr字段)作为主存地址送到MAR并自动送到地址线,经过一段时间以后,主存将0110(6#)单元中的33(变量y)送到数据线并自动存储在MDR中;最后由控制器控制将MDR中的内容送到0号通用寄存器,因此,指令I1的执行结果为R[0]=33。其他指令的执行过程类似。程序最后执行的结果为主存0111(7#)单元内容(变量z)变为49,即M[7]=49。
指令执行各阶段都包含若干个微操作,微操作需要相应的控制信号(control signal)进行控制。
• 取指令阶段IR←M[PC]微操作有:MAR←PC;控制线←Read;IR←MDR。
• 取数阶段R[0]←M[addr]微操作有:MAR←addr;控制线←Read;R[0]←MDR。
• 存数阶段M[addr]←R[0]微操作有:MAR←addr;MDR←R[0];控制线←Write。
• ALU运算R[0]←R[0]+R[1]微操作有:A←R[0];B←R[1];ALUop←add;R[0]←F。
ALU操作有加(add)、减(sub)、与(and)、或(or)、传送(mov)等类型。如图1.1所示,ALU操作控制信号ALUop可以控制ALU进行不同的运算,例如:当ALUop←mov时,ALU的输出F=A;当ALUop←add时,ALU的输出F=A+B。
这里的Read、Write、mov、add等微操作控制信号都是控制器对op字段进行译码后送出的,图1.1中的虚线所示的就是控制信号线。每条指令执行过程中,所包含的微操作具有先后顺序关系,需要用定时信号进行定时。通常,CPU中所有微操作都由时钟信号进行定时,时钟信号(clock signal)的宽度为一个时钟周期(clock cycle)。一条指令的执行时间包含一个或多个时钟周期。