第7章 指令系统
一、机器指令
机器语言是由一条条语句构成的,每一条语句又能准确表达某种语义。计算机就是连续执行每一条机器语句而实现全自动工作的,人们习惯把每一条机器语言的语句称为机器指令,而又将全部机器指令的集合称为机器的指令系统。计算机使用者根据机器指令系统所描述的机器功能,能很清楚地了解计算机内部寄存器-存储器的结构,以及计算机能直接支持的各种数据类型。
(一)指令的一般格式
指令是由操作码和地址码两部分组成的,其基本格式如图7-1所示。
图7-1 指令的一般格式
1.操作码
操作码用来指明该指令所要完成的操作,如加法、减法、传送、移位、转移等。通常,其位数反映了机器的操作种类,即机器允许的指令条数,如操作码占7位,则该机器最多包含27=128条指令。
操作码的长度可以是固定的,也可以是变化的。前者将操作码集中放在指令字的一个字段内,如图7-1所示。这种格式便于硬件设计,指令译码时间短,广泛用于字长较长的大中型计算机和超级小型计算机以及RISC(Reduced Instruction Set Computer)中。
对于操作码长度不固定的指令,其操作码分散在指令字的不同字段中。这种格式可有效地压缩操作码的平均长度,在字长较短的微型计算机中被广泛采用。
操作码长度不固定会增加指令译码和分析的难度,使控制器的设计复杂。通常采用扩展操作码技术,使操作码的长度随地址数的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
在设计操作码不固定的指令系统时,应尽量考虑安排指令使用频度(即指令在程序中出现的概率)高的指令占用短的操作码,对使用频度低的指令可占用较长的操作码,这样可以缩短经常使用的指令的译码时间。当然,考虑操作码长度时也应考虑地址码的要求。
2.地址码
地址码用来指出该指令的源操作数的地址(一个或两个)、结果的地址以及下一条指令的地址。这里的“地址”可以是主存的地址,也可以是寄存器的地址,甚至可以是I/O设备的地址。
下面以主存地址为例,分析指令的地址码字段。
(1)四地址指令
这种指令的地址字段有4个,其格式如下:
其中,OP为操作码;A1为第一操作数地址;A2为第二操作数地址;A3为结果地址;A4为下一条指令的地址。
(2)三地址指令
三地址指令中只有3个地址,其格式如下:
它可完成(A1)OP(A2)→A3的操作,后续指令的地址隐含在程序计数器PC之中。如果指令字长不变,设OP仍为8位,则3个地址字段各占8位,故三地址指令操作数的直接寻址范围可达28=256。同理,若地址字段均为主存地址,则完成一条三地址指令也需访问4次存储器。
(3)二地址指令
二地址指令中只含两个地址字段,其格式如下:
它可完成(A1)OP(A2)→A1的操作,即A1字段既代表源操作数的地址,又代表存放本次运算结果的地址。有的机器也可以表示(A1)OP(A2)→A2的操作,此时A2除了代表源操作数的地址外,还代表中间结果的存放地址。这两种情况完成一条指令仍需访问4次存储器。如果使其完成(A1)OP(A2)→ACC,此时,它完成一条指令只需3次访存,它的含义是中间结果暂存于累加器ACC中。在不改变指令字长和操作码的位数前提下,二地址指令操作数的直接寻址范围为212=4K。
(4)一地址指令
一地址指令的地址码字段只有一个,其格式如下:
它可完成(ACC)OP(A1)→ACC的操作,ACC既存放参与运算的操作数,又存放运算的中间结果,这样,完成一条一地址指令只需两次访存。在指令字长仍为32位、操作码位数仍固定为8位时,一地址指令操作数的直接寻址范围达224=16M。
(5)零地址指令
零地址指令在指令字中无地址码,例如,空操作(NOP)、停机(HLT)这类指令只有操作码。而子程序返回(RET)、中断返回(IRET)这类指令没有地址码,其操作数的地址隐含在堆栈指针SP中。
(二)指令字长
指令字长取决于操作码的长度、操作数地址的长度和操作数地址的个数。不同机器的指令字长是不相同的。
二、操作数类型和操作类型
(一)操作数类型
1.地址
地址实际上也可看做是一种数据,在许多情况下要计算操作数的地址。这时,地址可被认为是一个无符号的整数,有关地址的计算问题将在7.3节讨论。
2.数字
计算机中常见的数字有定点数、浮点数和十进制数。前两种数字在第6章中已进行了介绍。
3.字符
在应用计算机时,文本或者字符串也是一种常见的数据类型。由于计算机在处理信息过程中不能以简单的字符形式存储和传送,因此普遍采用ASCII码,它是很重要的一种字符编码。
4.逻辑数据
计算机除了作算术运算外,有时还需作逻辑运算,此时n个0和1的组合不是被看做算术数字,而是被看做逻辑数。
(二)数据在存储器中的存放方式
通常计算机中的数据存放在存储器或寄存器中,而寄存器的位数便可反映机器字长。一般机器字长可取字节的1、2、4、8倍,这样便于字符处理。在大、中型机器中字长为32位和64位,在微型计算机中字长从4位、8位逐渐发展到目前的16位、32位和64位。
由于不同的机器数据字长不同,每台机器处理的数据字长也不统一,例如奔腾处理器可处理8(字节)、16(字)、32(双字)、64(四字)。因此,为了便于硬件实现,通常要求多字节的数据在存储器的存放方式能满足“边界对准”的要求,如图7-2所示。
图7-2中所示的存储器存储字长为32位,可按字节、半字、字、双字访问。在对准边界的32位字长的计算机中(如图7-2(a)所示),半字地址是2的整数倍,字地址是4的整数倍,双字地址是8的整数倍。当所存数据不能满足此要求时,可填充一个至多个空白字节。而字节的次序有两种,如图7-3所示,其中图7-3(a)表示低字节为低地址,图7-3(b)表示高字节为低地址。
在数据不对准边界的计算机中,数据(例如一个字)可能在两个存储单元中,此时需要访问两次存储器,并对高低字节的位置进行调整后,才能取得一个字,图7-2(b)的阴影部分即属于这种情况。
图7-2 存储器中数据的存放
图7-3 两种字节次序
(三)操作类型
1.数据传送
数据传送包括寄存器与寄存器、寄存器与存储单元、存储单元与存储单元之间的传送。如从源到目的之间的传送、对存储器读(LOAD)和写(STORE)、交换源和目的的内容、置1、清零、进栈、出栈等。
2.算术逻辑操作
这类操作可实现算术运算(加、减、乘、除、增1、减1、取负数即求补)和逻辑运算(与、或、非、异或)。对于低档机而言,一般算术运算只支持最基本的二进制加减、比较、求补等,高档机还能支持浮点运算和十进制运算。
有些机器还具有位操作功能,如位测试(测试指定位的值)、位清除(清除指定位)、位求反(对指定位求反)等。
3.移位
移位可分为算术移位、逻辑移位和循环移位三种。算术移位和逻辑移位分别可实现对有符号数和无符号数乘以2n(左移)或整除以2n(右移)的运算,并且移位操作所需时间远比乘除操作执行时间短,因此,移位操作经常被用来代替简单的乘法和除法运算。
4.转移
在多数情况下,计算机是按顺序执行程序的每条指令的,但有时需要改变这种顺序,此时可采用转移类指令来完成。转移指令按其转移特征又可分为无条件转移、条件转移、跳转、过程调用与返回、陷阱(Trap)等几种。
(1)无条件转移
无条件转移不受任何条件约束,可直接把程序转移到下一条需执行指令的地址。例如“JMP X”,其功能是将指令地址无条件转至X。
(2)条件转移
条件转移是根据当前指令的执行结果来决定是否需要转移。若条件满足,则转移;若条件不满足,则继续按顺序执行。一般机器都能提供一些条件码,这些条件码是某些操作的结果。
(3)调用与返回
在编写程序时,有些具有特定功能的程序段会被反复使用。为避免重复编写,可将这些程序段设定为独立子程序,当需要执行某子程序时,只需用子程序调用指令即可。此外,计算机系统还提供了通用子程序、如申请资源、读写文件、控制外设等。需要时均可由用户直接调用,不必重新编写。
通常调用指令包括过程调用、系统调用和子程序调用。它可实现从一个程序转移到另一个程序的操作。
调用指令(CALL)一般与返回指令(RETURN)配合使用。CALL用于从当前的程序位置转至子程序的入口;RETURN用于子程序执行完后重新返回到原程序的断点。图7-4示意了调用(CALL)和返回(RETURN)指令在程序执行中的流程。
图7-4 调用和返回指令示意图
(4)陷阱(Trap)与陷阱指令
陷阱其实是一种意外事故的中断。此刻必须及时采取措施,否则将影响整个系统的正常运行。因此,一旦出现意外故障,计算机就发出陷阱信号,暂停当前程序的执行,转入故障处理程序进行相应的故障处理。
计算机的陷阱指令一般不提供给用户直接使用,而作为隐指令(即指令系统中不提供的指令),在出现意外故障时,由CPU自动产生并执行。也有的机器设置供用户使用的陷阱指令或“访管”指令,利用它完成系统调用和程序请求。
5.输入输出
对于I/O单独编址的计算机而言,通常设有输入输出指令,它完成从外设中的寄存器读入一个数据到CPU的寄存器内,或将数据从CPU的寄存器输出至某外设的寄存器中。
6.其他
其他包括等待指令、停机指令、空操作指令、开中断指令、关中断指令、置条件码指令等。有的计算机还设有非数值处理指令,如字符串传送、字符串比较、字符串查询及字符串转换等。
三、寻址方式
(一)指令寻址
指令寻址比较简单,它分为顺序寻址和跳跃寻址两种。
顺序寻址可通过程序计数器PC加1,自动形成下一条指令的地址;跳跃寻址则通过转移类指令实现。图7-5示意了指令寻址过程。
图7-5 指令的寻址方式示意图
(二)数据寻址
数据寻址方式种类较多,在指令字中必须设一字段来指明属于哪一种寻址方式。指令的地址码字段通常都不代表操作数的真实地址,把它称为形式地址,记作A。操作数的真实地址称为有效地址,记作EA,它是由寻址方式和形式地址共同来确定的。由此可得指令的格式应如图7-6所示。
图7-6 一种一地址指令的格式
为了便于分析研究各类寻址方式,假设指令字长、存储字长、机器字长均相同。
1.立即寻址
立即寻址的特点是操作数本身设在指令字内,即形式地址A不是操作数的地址,而是操作数本身,又称之为立即数。数据是采用补码形式存放的,如图7-7所示,图中“#”表示立即寻址特征标记。
图7-7 立即寻址示意图
优点在于只要取出指令,便可立即获得操作数,这种指令在执行阶段不必再访问存储器。显然A的位数限制了这类指令所能表述的立即数的范围。
2.直接寻址
直接寻址的特点是,指令字中的形式地址A就是操作数的真实地址EA,即EA=A
图7-8示意了直接寻址。
图7-8 直接寻址示意图
优点是寻找操作数比较简单,也不需要专门计算操作数的地址,在指令执行阶段对主存只访问一次。它的缺点在于A的位数限制了操作数的寻址范围,而且必须修改A的值,才能修改操作数的地址。
3.隐含寻址
隐含寻址是指指令字中不明显地给出操作数的地址,其操作数的地址隐含在操作码或某个寄存器中。图7-9示意了隐含寻址。
图7-9 隐含寻址示意图
4.间接寻址
倘若指令字中的形式地址不直接指出操作数的地址,而是指出操作数有效地址所在的存储单元地址,也就是说,有效地址是由形式地址间接提供的,即为间接寻址,即EA=(A),如图7-10所示。
图7-10 间接寻址示意图
图7-10(a)为一次间接寻址,即A地址单元的内容EA是操作数的有效地址;图7-10(b)为两次间接寻址,即A地址单元的内容A1还不是有效地址,而由A1所指单元的内容EA1才是有效地址。
间接寻址的第二个优点在于它便于编制程序。例如,用间接寻址可以很方便地完成子程序返回,图7-11示意了用于子程序返回的间址过程。
图7-11 用于子程序返回的间址过程的示意图
间接寻址的缺点在于指令的执行阶段需要访存两次(一次间接寻址)或多次(多次间接寻址),致使指令执行时间延长。
5.寄存器寻址
在寄存器寻址的指令字中,地址码字段直接指出了寄存器的编号,即EA=Ri,如图7-12所示,其操作数在由Ri所指的寄存器内。由于操作数不在主存中,故寄存器寻址在指令执行阶段无须访存,减少了执行时间。由于地址字段只需指明寄存器编号(计算机中寄存器数有限),故指令字较短,节省了存储空间,因此寄存器寻址在计算机中得到广泛应用。
图7-12 寄存器寻址示意图
6.寄存器间接寻址
图7-13示意了寄存器间接寻址过程。
图7-13 寄存器间接寻址示意图
图中Ri中的内容不是操作数,而是操作数所在主存单元的地址号,即有效地址EA=(Ri)。与寄存器寻址相比,指令的执行阶段还需访问主存。
7.基址寻址
基址寻址需设有基址寄存器BR,其操作数的有效地址EA等于指令字中的形式地址与基址寄存器中的内容(称为基地址)相加,即
EA=A+(BR)
图7-14示意了基址寻址过程。
图7-14 基址寻址示意图
对应图7-14(a)为隐式基址寻址,图7-14(b)为显式基址寻址。
8.变址寻址
变址寻址与基址寻址极为相似。其有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即
EA=A+(IX)
显然只要变址寄存器位数足够,也可扩大操作数的寻址范围,其寻址过程如图7-15所示。
图7-15 变址寻址示意图
9.相对寻址
相对寻址的有效地址是将程序计数器PC的内容(即当前指令的地址)与指令字中的形式地址A相加而成,即
EA=(PC)+A
图7-16示意了相对寻址的过程,由图中可见,操作数的位置与当前指令的位置有一段距离A。
图7-16 相对寻址示意图
相对寻址常被用于转移类指令,转移后的目标地址与当前指令有一段距离,称为相对位移量,它由指令字的形式地址A给出,故A又称位移量。位移量A可正可负,通常用补码表示。倘若位移量为8位,则指令的寻址范围在(PC)+127~(PC)-128之间。
10.堆栈寻址
堆栈寻址要求计算机中设有堆栈。堆栈既可用寄存器组(称为硬堆栈)来实现,也可利用主存的一部分空间作堆栈(称为软堆栈)。堆栈的运行方式为先进后出或后进先出两种,先进后出型堆栈的操作数只能从一个口进行读或写。以软堆栈为例,可用堆栈指针SP(Stack Point)指出栈顶地址,也可用CPU中一个或两个寄存器作为SP。操作数只能从栈顶地址指示的存储单元存或取。可见堆栈寻址也可视为一种隐含寻址,其操作数的地址总被隐含在SP中。堆栈寻址就其本质也可视为寄存器间接寻址,因SP可视为寄存器,它存放着操作数的有效地址。图7-17示意了堆栈寻址过程。
图7-17 堆栈寻址示意图
四、指令格式举例
指令格式不仅体现了指令系统的各种功能,而且也突出地反映了机器的硬件结构特点。设计指令格式时必须从诸多方面综合考虑,并经一段模拟运行后,最后确定。
(一)集中反映了机器的性能,又是程序员编程的依据
用户在编程时既希望指令系统很丰富,便于用户选择,同时还要求机器执行程序时速度快、占用主存空间少,实现高效运行。此外,为了继承已有的软件,必须考虑新机器的指令系统与同一系列机器指令系统的兼容性,即高档机必须能兼容低档机的程序运行,称之为“向上兼容”。
指令格式集中体现了指令系统的功能,为此,在确定指令格式时,必须从以下几个方面综合考虑。
1.操作类型:包括指令数及操作的难易程度。
2.数据类型:确定哪些数据类型可以参与操作。
3.指令格式:包括指令字长、操作码位数、地址码位数、地址个数、寻址方式类型,以及指令字长和操作码位数是否可变等。
4.寻址方式:包括指令和操作数具体有哪些寻址方式。
5.寄存器个数:寄存器的多少直接影响指令的执行时间。
(二)指令格式举例
1.PDP-8
PDP-8的指令字长统一为12位,CPU内只设一个通用寄存器,即累加器ACC,其主存被划分为若干个容量相等的存储空间(每个相同的空间被称为一页)。该机的指令格式可分为三大类,如图7-18所示。
图7-18 PDP-8指令格式
2.PDP-11
PDP-11机器字长为16位,CPU内设8个16位通用寄存器,其中两个通用寄存器有特殊作用,一个用做堆栈指针SP,一个用做程序计数器PC。
PDP-11指令字长有16位、32位和48位三种,采用操作码扩展技术,使操作码位数不固定,指令字的地址格式有零地址、一地址、二地址等共有13类指令格式,图7-19列出了其中五种。
图7-19 PDP-11五种指令格式
3.IBM 360
IBM 360属于系列机。所谓系列机,是指其基本指令系统相同,基本体系结构相同的一系列计算机。IBM 370对IBM 360是完全向上兼容的。所以IBM 370可看做IBM 360的扩展或延伸或改进。
IBM 360是32位机器,按字节寻址,并可支持多种数据类型,如字节、半字、字、双字(双精度实数)、压缩十进制数、字符串等。在CPU中有16个32位通用寄存器(用户可选定任一个寄存器作为基址寄存器BR或变址寄存器IX),4个双精度(64位)浮点寄存器。指令字长有16位、32位、48位三种,如图7-20所示。
图7-20 IBM 360/370指令格式
4.Inte18086/80486系列机
Inte18086/80486系列微型计算机的指令字长为1~6个字节,即不定长。例如,零地址格式的空操作指令NOP只占一个字节;一地址格式的CALL指令可以是3字节(段内调用)或5字节(段间调用);二地址格式指令中的两个操作数既可以是寄存器-寄存器型、寄存器-存储器型,也可以是寄存器-立即数型或存储器-立即数型,它们所占的字节数分别为2~2、2~4、2~3、3~6个字节。
五、RISC技术
(一)RISC的产生和发展
在系列机的发展过程中,致使同一系列计算机指令系统变得越来越复杂,某些机器的指令系统竟可包含几百条指令,这类机器被称为复杂指令系统计算机,简称CISC。
表7-1是HP公司对IBM 370高级语言中指令使用频度的分析结果。Marathe在1978年对PDP-11机在五种不同应用领域中的指令混合测试,也得出了类似的结论。
表7-1 IBM 370机指令的使用频度(%)
较为著名的第三代RISC机的有关性能指标如表7-2所示。
表7-2 第三代RISC处理器的性能比较
(二)RISC的主要特征
RISC技术是用20%的简单指令的组合来实现不常用的80%的那些指令功能,但这不意味着RISC技术就是简单地精简其指令集。在提高性能方面,RISC技术还采取了许多有效措施,最有效的方法就是减少指令的执行周期数。
计算机执行程序所需的时间P可用下式表述:
P=I×C×T
其中,I是高级语言程序编译后在机器上运行的机器指令数;C为执行每条机器指令所需的平均机器周期;T是每个机器周期的执行时间。
表7-3列出了第二代RISC机与CISC机的I、C、T统计,其中I、T为比值,C为实际周期数。
表7-3 RISC/CISC的I、C、T统计比较
1.RISC的主要特点
通过对RISC各种产品的分析,可归纳出RISC机应具有如下一些特点。
(1)选取使用频度较高的一些简单指令以及一些很有用但又不复杂的指令,让复杂指令的功能由频度高的简单指令的组合来实现。
(2)指令长度固定,指令格式种类少,寻址方式种类少。
(3)只有取数/存数(LOAD/STORE)指令访问存储器,其余指令的操作都在寄存器内完成。
(4)CPU中有多个通用寄存器。
(5)采用流水线技术,大部分指令在一个时钟周期内完成。采用超标量和超流水线技术,可使每条指令的平均执行时间小于一个时钟周期。
(6)控制器采用组合逻辑控制,不用微程序控制。
(7)采用优化的编译程序。
值得注意的是,商品化的RISC机通常不会是纯RISC机,故上述这些特点不是所有RISC机全部具备的。
相比之下,CISC的指令系统复杂庞大,各种指令使用频度相差很大;指令字长不固定,指令格式多,寻址方式多;可以访存的指令不受限制;CPU中设有专用寄存器;绝大多数指令需要多个时钟周期方可执行完毕;采用微程序控制器;难以用优化编译生成高效的目标代码。
2.RISC II指令系统举例
(1)指令种类
RISC II共有39条指令,分为以下4类。
①寄存器-寄存器操作:移位、逻辑、算术(整数)运算等12条;
②取/存数指令:取存字节、半字、字等16条;
③控制转移指令:条件转移、调用/返回等6条;
④其他:存取程序状态字PSW和程序计数器等5条。
(2)指令格式
RISC机的指令格式比较简单,寻址方式也比较少,如RISC II的指令格式有两种:短立即数格式和长立即数格式。指令字长固定为32位,指令字中每个字段都有固定位置,如图7-21所示。
图7-21 RISC II的指令格式
(3)寻址方式
RISC II指令系统有两种访存寻址方式。一种是变址寻址,另一种是相对寻址,还可用组合方式产生其他寻址方式。若令变址寄存器内容为0(因该机约定寄存器R0内容恒为0,所以只要指定R0作为变址寄存器即可实现),则成为直接寻址方式;若令位移量为0,则成为寄存器间接寻址方式。
3.RISC指令系统的扩充
从实用角度出发,商品化的RISC机,因用途不同还可扩充一些指令,例如:
(1)浮点指令;
(2)特权指令;
(3)读后置数指令;
(4)一些简单的专用指令。
(三)RISC和CISC的比较
1.充分利用VLSI芯片的面积
CISC机的控制器大多采用微程序控制,其控制存储器在CPU芯片内所占的面积为50%以上。而RISC机控制器采用组合逻辑控制,其硬布线逻辑只占CPU芯片面积的10%左右。可见它可将空出的面积供其他功能部件用,例如用于增加大量的通用寄存器,或将存储管理部件也集成到CPU芯片内。以上两种芯片的集成度分别小于10万个和20万个晶体管。
2.提高计算机运算速度
(1)RISC机的指令数、寻址方式和指令格式种类较少,而且指令的编码很有规律,因此RISC的指令译码比CISC的指令译码快。
(2)RISC机内通用寄存器多,减少了访存次数,可加快运行速度。
(3)RISC机采用寄存器窗口重叠技术,程序嵌套时不必将寄存器内容保存到存储器中,故又提高了执行速度。
(4)RISC机采用组合逻辑控制,比采用微程序控制的CISC机的延迟小,缩短了CPU的周期。
(5)RISC机选用精简指令系统,适合于流水线工作,大多数指令在一个时钟周期内完成。
3.便于设计,可降低成本,提高可靠性
RISC机指令系统简单,故机器设计周期短。
RISC机逻辑简单,设计出错可能性小,有错时也容易发现,可靠性高。
4.有效支持高级语言程序
RISC机靠优化编译来更有效地支持高级语言程序。由于RISC指令少,寻址方式少,使编译程序容易选择更有效的指令和寻址方式,而且由于RISC机的通用寄存器多,可尽量安排寄存器的操作,使编译程序的代码优化效率提高。
有些RISC机采用寄存器窗口重叠技术,使过程间的参数传送加快,且不必保存与恢复现场,能直接支持调用子程序和过程的高级语言程序。表7-4列出了一些 CISC与RISC微处理器的特征。
表7-4 一些CISC与RISC微处理器的特征