文章目录
本章主要介绍机器指令系统的分类、常见的寻址方式、指令格式以及设计指令系统时应考虑的各种因素。此外对RISC技术也进行简要的介绍,需要进一步地体会指令系统与机器的主要功能以及硬件结构之间存在的密切关系。
1. 机器指令
计算机能进行计算是由于机器本身存在一种语言,它既能理解人的意图,又能被机器自身识别。机器语言是由一条条语句构成的,每一条语句又能准确表达某种语义。计算机就是连续执行每一条机器语句而实现全自动工作的。人们习惯把每一条机器语言的语句称为机器指令,而又将全部机器指令的集合称为机器的指令系统,因此机器的指令系统集中反映了机器的功能。
计算机设计者主要研究如何确定机器的指令系统,如何用硬件电路、芯片、设备来实现机器指令系统的功能。
计算机使用者是依据机器提供的指令系统,使用汇编语言来编制各种程序。根据机器指令系统所描述的机器功能,能很清楚地了解计算机内部寄存器 - 存储器的结构,以及计算机能直接支持的各种数据类型。
1.1 指令的一般格式
指令是由操作码和地址码两部分组成的,其基本格式如下图:
- 操作码
操作码用来指明该指令所要完成的操作,如加法、减法、传送、移位、转移等,其位数反映了机器的操作种类,也即机器允许的指令条数。
操作码的长度是可以固定的,也可以是变化的。
长度固定的操作码将操作码集中放在指令字的一个字段内,这种格式便于硬件设计,指令译码时间短,广泛用于字长较大的、大中型计算机和超级小型计算机以及RISC(精简指令集)中。
长度变化的操作码其操作码分散在指令字的不同字段中。这种格式可有效地压缩操作码的平均长度,在字长较短的微型计算机中被广泛采用。
操作码长度不固定会增加指令译码和分析的难度,使控制器的设计复杂。通常采用扩展操作码技术,使操作码的长度随地址数的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。下图是一种扩展操作码的安排示意图:
- 地址码
地址码用来指出该指令的源操作数的地址(一个或两个)、结果的地址以及下一条指令的地址。这里的地址可以是主存的地址,也可以是寄存器的地址,甚至可以是I/O设备的地址。
1.2 指令字长
指令字长取决于操作码的长度、操作数地址的长度和操作数地址的个数。不同机器的指令字长是不相同的。
**早期的计算机指令字长、机器字长和存储字长均相等,**因此访问某个存储单元,便可取出一条完整的指令或一个完整的数据。这种机器的指令字长是固定的,控制方式比较简单。
随着计算机的发展,存储容量的增大,要求处理的数据类型增多,计算机的指令字长也发生了很大的变化,一台机器的指令系统可以采用位数不相同的指令,即指令字长是可变的,如单字长指令、多字长指令。控制这类指令的电路比较复杂,而且多字长指令要多次访问存储器才能取出一条完整的指令,因此使CPU的速度下降。为了提高指令的运算速度和节省存储空间,通常尽可能的把常用的指令(如数据传送指令、算逻运算指令等)设计成单字长或短字长格式的指令。
2. 操作数类型和操作类型
2.1 操作数类型
机器中常见的操作数类型有地址、数字、字符、逻辑数据等。
- 地址
地址实际上也可以看作是一种数据,在许多情况下要计算操作数的地址。这时,地址可以被认为是一个无符号的整数,有关地址的计算问题在第3节讨论。 - 数字
计算机中常见的数字有定点数、浮点数和十进制数。 - 字符
在应用计算机时,文本或者字符串也是一种常见的数据类型。由于计算机在处理信息过程中不能以简单的字符形式存储和传送,因此普遍采用ASCLL
码,它是很重要的一种字符编码。当然还有其他一些字符编码,如8位EBCDIC
,又称扩展BCD
交换码。 - 逻辑数据
计算机除了作算术运算外,有时还需要做逻辑运算,此时n个0和1的组合不是被看做算术数字,而是被看作逻辑数字。
2.2 数据在存储器中的存放方式
通常计算机中的数据存放在存储器或寄存器中,而寄存器的位数便可反映机器字长。一般机器字长可取字节的1、2、4、8倍,这样便于字符处理。在大、中型机器中字长为32位和64位,在微型计算机中字长从4位,8位逐渐发展到目前的16位、32位和64位。
由于不同的机器数据字长不同,每台机器处理的数据字长也不统一。因此,为了便于硬件实现,通常要求多字节的数据在存储器中的存放方式能满足边界对准的要求,如下图所示:
上面的图所示的存储器存储字长为32位,可按字节、半字、字、双字访问。在对准边界的32位字长的计算机中,半字地址是2的整数倍,字地址是4的整数倍,双字地址是8的整数倍,当所存数据不能满足此要求时,可填充一个至多个空白字节。而字节的次序有两种,如下图分别为表示低字节为低地址,表示高字节为低地址。
在数据不对准边界的计算机中,数据(例如一个字)可能在两个存储单元中,此时需要访问两次存储器,并对高低字节的位置进行调整后,才能取得一个字,下图的阴影部分即属于这种情况。
2.3 操作类型
不同的机器,操作类型也是不同的,但几乎所有的机器都有以下几类通用的操作。
- 数据传送
数据传送包括寄存器与寄存器、寄存器与存储单元、存储单元与存储单元之间的传送。如从源到目的地之间的传送、对存储器的读(加载 - LOAD)和写(存储 - STORE)、交换源和目的的内容、置1、清零、进栈、出栈等。 - 算术逻辑操作
这类操作可实现算术运算(加、减、乘、除、增1、减1、求补)和逻辑运算(与、或、非、异或)。对于低档机而言,一般的算术运算只支持最基本的二进制加减、比较、求补等,对于高档机还能支持浮点运算和十进制运算。
有些机器还具有位操作功能,如位测试(测试指定位的值)、位清除(清除指定位)、位求反(对指定位求反)等。 - 移位
移位可分为算术移位、逻辑移位和循环移位三种。算术移位和逻辑移位分别可实现对有符号数和无符号数乘2n(左移)或整除以2n(右移)的运算,并且移位操作所需时间远比乘除操作执行时间短,因此,移位操作经常被用来代替简单的乘法和除法运算。 - 转移
在多数情况下,计算机是按顺序执行程序的每条指令的,但有时需要改变这种顺序,此时可以采用转移类指令来完成。转移指令按其特征又可分为无条件转移、条件转移、跳转、过程调用与返回、陷阱等几种。
- 输入输出
对于I/O单独编制的计算机而言,通常设有输入输出指令,它完成从外设中的寄存器读入一个数据到CPU的寄存器内,或将数据从CPU的寄存器输出至某外设的寄存器中。 - 其他
其他包括等待指令、停机指令、空操作指令、开中断指令、关中断指令、置条件码指令等。
为了适应计算机的信息管理、数据处理及办公自动化等领域的应用,有的计算机还设有非数值处理指令。如字符串传送、字符串比较、字符串查询及字符串转移等。
在多用户、多任务的计算机系统中,还设有特权指令,这类指令只能用于操作系统或其他系统软件,用户是不能使用的。
在有些大型或巨型机中,还设有向量指令,可对整个向量或矩阵进行求和、求积运算。在多处理器系统中还配有专门的多处理机指令。
2.3 寻址方式
寻址方式是确定本条指令的数据地址以及下一条将要执行的指令的地址的方法。它与硬件结构密切相关,而且直接影响指令格式和指令功能。
寻址方式分为指令寻址和数据寻址两大类。
2.3.1 指令寻址
指令寻址相对数据寻址比较简单而且也没有那么重要,它分为顺序寻址和跳跃寻址两种。、
顺序寻址可通过程序计数器PC+1,自动形成下一条指令的地址,跳跃寻址则通过转移类指令实现。如下图示意了指令寻址过程。
如果程序的首地址为0,只要先将0送至程序计数器PC中,启动机器运行后,程序便按0,1,2,3,4,5,6,7,8,9,…,顺序执行。其中第1、2、3号指令地址由PC自动形成。因3号地址指令为JMP 7
,故执行完第3号指令后,便无条件将7送至PC,因此,此刻指令地址跳过4、5、6三条,直接执行第7条指令,接着又顺序执行第8条、第9条等指令。
2.3.2 数据寻址
数据寻址方式种类较多,在指令字中必须设一字段来指明属于哪一种寻址方式。指令的地址码字段通常都不代表操作数的真实地址,把它称为形式地址,记作A。操作数的真实地址称为有效地址,记作EA,它是由寻址方式和形式地址共同来确定。由此可得指令的格式应如下图:
-
立即寻址
立即寻址的特点是操作数本身设在指令字内,即形式地址A不是操作数的地址,而是操作数本身,又称之为立即数。数据采用补码形式存放,如下图所示,#
表示立即寻址特征标记。
可见,它的**优点:在于只要取出指令,便可立即获得操作数,这种指令在执行阶段不必再访问存储器。
显然,它的缺点:**在于A的位数限制了这类指令所能表述的立即数的范围。 -
直接寻址
直接寻址的特点是,指令字中的形式地址A就是操作数的真实地址EA,即EA = A,
下图示意了直接寻址:
它的**优点:是寻址操作数比较简单,也不需要专门计算操作数的地址,在指令执行阶段对主存只访问一次。
它的缺点:**在于A的位数限制了操作数的寻址范围,而且必须修改A的值,才能修改操作数的地址。
-
隐含寻址
隐含寻址是指指令字中不明显地给出操作数的地址,其操作数的地址隐含在操作码或某个寄存器中。例如,一地址格式的加法指令值给出一个操作数的地址,另一个操作数隐含在累加器ACC中,这样累加器ACC成了另一个数的地址。下图示意了隐含寻址:
又如IBM PC中的乘法指令,被乘数隐含在寄存器AX或寄存器AL中,可见AXorAL就是被乘数的地址。
又如字符串传送指令MOVS,其源操作数的地址隐含在SI寄存器中,目的操作数的地址隐含在DI寄存器中。
由于隐含寻址在指令字中少了一个地址,因此,这种寻址方式的指令有利于缩短指令字长。 -
间接寻址
倘若指令字中的形式地址不直接指出操作数的地址,而是指出操作数有效地址所在的存储单元地址,也就是说,有效地址是由形式地址间接提供的,即为间接寻址,即EA = (A),如下图所示:
上图a为一次间接寻址,即A地址单元的内容EA是操作数的有效地址,b为两次间接寻址,即A地址单元的内容A1还不是有效地址,而由A1所指单元的内容EA才是有效地址。
优点1: 间接寻址与直接寻址相比,它扩大了操作数的寻址范围,因为A的位数通常小于指令字长,而存储字长可与指令字长相等。若设指令字长和存储字长均为16位,A为8位,显然直接寻址范围为28,一次间接寻址的寻址范围可达216。当多次间接寻址时,可用存储字的首位来标志间接寻址是否结束,如上图b所示,当存储字首位为1的时候,标明还需继续访存寻址,当存储字首位为0时,标明该存储字即为EA。由此可见,存储字首位不能作为EA的组成部分,因此,它的寻址范围为215。
优点2: 便于编制程序。例如,用间接寻址可以很方便地完成子程序返回,如下图示意了用于子程序返回的间址过程。
-
寄存器寻址
在寄存器寻址的指令字中,地址码字段直接指出了寄存器的编号,即EA = Ri,如下图所示:
其操作数在由Ri所指的寄存器内。由于操作数不在主存中,故寄存器寻址在指令执行阶段无须访存,减少了执行时间。由于地址字段只需指明寄存器编号(计算机中寄存器数有限),故指令字较短,节省了存储空间,因此寄存器寻址在计算机中得到广泛应用。 -
寄存器间接寻址
下图示意了寄存器间接寻址过程:
图中Ri中的内容不是操作数,而是操作数所在主存单元的地址号,即有效地址EA = (Ri)。与寄存器寻址相比,指令的执行阶段还需访问主存。与一次间接寻址(下面的图)相比,因有效地址不是存放在存储单元中,而是存放在寄存器中,故称其为寄存器间接寻址,它比间接寻址少访存一次。
-
基址寻址
基址寻址需设有基址寄存器BR,其操作数的有效地址EA等于指令字中的形式地址与基址寄存器中的内容(也称为基地址)相加,即:EA = A + (BR)
下图示意了基址寻址过程:
基址寄存器可采用隐式的显式的两种。
所谓隐式,是在计算机内专门设有一个基址寄存器BR,使用使用户不必明显指出该基址寄存器,只需由指令的寻址特征位反映出基址寻址即可。显式是在一组通用寄存器里,由用户明确指出哪个寄存器用作基址寄存器,存放基地址。上图的a为隐式,b为显式。
-
变址寻址
-
相对寻址
-
堆栈寻址
4. 指令格式举列
4.1 设计指令格式应考虑的各种因素
指令系统集中反映了机器的性能,又是程序员编程的依据。用户在编程中既希望指令系统很丰富,便于用户的选择,同时还要求机器执行程序时的速度快,占用主存空间少,实现高效运行。此外,为了集成已有的软件,必修考虑新机器和指令系统与同一系列机器指令系统的兼容性,即高档机必须能兼容低档机的程序运行,称之为向上兼容。
指令格式集中体现了指令系统的功能,为此,在确定指令格式时,必须从以下几个方面考虑:
- 操作类型:包括指令数及操作的难易程度。
- 数据类型:确定哪些数据类型可以参与操作。
- 指令格式:包括指令字长、操作码位数、地址码位数、地址个数、寻址方式类型,以及字长和操作码位数是否可变等。
- 寻址方式:包括指令和操作数具体有哪些寻址方式。
- 寄存器个数:寄存器的多少直接影响指令的执行时间。
4.2 指令格式举例
4.3 指令格式设计举例
5. RISC技术
RISC即精简指令系统计算机(Reduced Instruction Set Computer),与其对应的是CISC即复杂指令系统计算机(Complex Instruction Set Computer)。
5.1 RISC的产生和发展
5.2 RISC的主要特征
5.3 RISC和CISC的比较