计算机组成原理知识点汇总(考研用)——第四章:指令系统
本文参考于《2021年计算机组成原理考研复习指导》(王道考研),《计算机组成原理》
思维导图:
4.指令系统
4.1 指令格式
指令(又称机器指令)是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称指令集。 指令系统是计算机的主要属性,位于硬件和软件的交界面上。
4.1.1 指令的基本格式
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。一条指令通常包括操作码字段和地址码字段两部分:
其中,操作码指出指令中该指令应该执行什么性质的操作和具有何种功能。操作码是识别指令、了解指令功能及区分操作数地址内容的组成和使用方法等的关键信息。例如,指出是算术加运算还是算术减运算,是程序转移还是返回操作。
地址码给出被操作的信息(指令或数据)的地址(这里的“地址”可以是主存地址,也可以是寄存器的地址,甚至可以是I/O设备的地址),包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等。
指令的长度是指一条指令中所包含的二进制代码的位数。指令字长取决于操作码的长度、操作数地址码的长度和操作数地址的个数。指令长度与机器字长没有固定的关系,它可以等于机器字长,也可以大于或小于机器字长。 通常,把指令长度等于机器字长的指令称为单字长指令,指令长度等于半个机器字长的指令称为半字长指令,指令长度等于两个机器字长的指令称为双字长指令。
在一个指令系统中,若所有指令的长度都是相等的,则称为定长指令字结构。若各种指令的长度随指令功能而异,则称为变长指令字结构。 因为主存一般是按字节编址的,所以指令字长多为字节的整数倍。
根据指令中操作数地址码的数目的不同,可将指令分成以下几种格式:
1.零地址指令
只给出操作码OP,没有显式地址。这种指令有两种可能:
(1)不需要操作数的指令,如空操作指令、停机指令、关中断指令等
(2)零地址的运算类指令仅用在堆栈计算机中。通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈。
2.一地址指令
根据操作码的含义不同,有两种常见形态:
(1)只有目的操作数的单操作数指令,按A1地址读取操作数,进行OP操作后,结果存回原地址。指令含义:OP(A1)——>A1;
如操作码含义是加1、减1、求反、求补等
(2)隐含约定目的地址的双操作数指令,按指令地址A1可读取源操作数,指令可隐含约定另一个操作数由ACC提供,运算结果也将存放在ACC中。指令含义:(ACC)OP(A1)——>ACC;
若指令字长为32位,操作码占8位,1个地址码字段占24位,则指令操作数的直接寻址范围为224=16M;
3.二地址指令
指令含义:(A1)OP(A2)——>A1;
对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数地址还用于保存本次的运算结果。
若指令字长为32位,操作码占8位,两个地址码字段各占12位,则指令操作数的直接寻址范围为212=4K
4.三地址指令
指令含义:(A1)OP(A2)——>A3
若指令字长为32位,操作码占8位,3个地址码字段各占8位,则指令操作数的直接寻址范围为28=256。若地址字段均为主存地址,则完成一条三地址需要4次访问存储器(取指令1次,取两个操作数2次,存放结果1次)
5.四地址指令
指令含义:(A1)OP(A2)——>A3,A4=下一条将要执行指令的地址
若指令字长为32位,操作码占8位,4个地址码字段各占6位,则指令操作数的直接寻址范围为26=64
4.1.2 定长操作码指令格式
定长操作码指令在指令字的最高位部分分配固定的若干位(定长)表示操作码。一般n位操作码字段的指令系统最大能够表示2n条指令。
4.1.3 扩展操作码指令格式
为了在指令字长有限的前提下仍保持比较丰富的指令种类,可采取可变长度操作码,即全部指令的操作码字段的尾数不固定,且分散地放在指令字的不同位置上。
最常见的变长操作码方法是扩展操作码,它使操作码的长度随地址码的减少而增加,不同地址数的指令可具有不同长度的操作码, 从而在满足需要的前提下,有效地缩短指令字长。下图为一种扩展操作码的安排方式:
在图中,指令字长为16位,其中4位为基本操作码字段OP,另有3个4位长的地址字段A1、A2、A3。图中所示的三地址指令为15条,1111留作扩展操作码之用;二地址指令15条,1111 1111留作扩展操作码之用;一地址指令为15条,1111 1111 1111留作扩展操作码之用;零地址指令为16条。
除这种安排外,还有其他多种扩展方法,如形成15条三地址指令、12条二地址指令、63(3x16+15)条一地址指令和16条零地址指令。
在设计扩展操作码指令格式时,须注意:
(1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
(2)各指令的操作码不能重复
通常情况下,对使用频率较高的指令分配较短的操作码,对使用频率较低的指令分配较长的操作码。
例题:一个计算机系统采用32位单字长指令,地址码为12位,若定义了250条二地址指令,则还可以有()条单地址指令
答案:24K;
例题:一处理器中共有32个寄存器,使用16位立即数,其指令系统结构中共有142条指令。在某个给定的程序中,20%的指令带有一个输入寄存器和一个输出寄存器;30%的指令带有两个输入寄存器和一个输出寄存器;25%的指令带有一个输入寄存器、一个输出寄存器、一个立即数寄存器;其余25%的指令带有一个立即数输入寄存器和一个输出寄存器。
(1)对于以上4种指令类型中的任意一种指令类型来说,共需多少位?假定指令系统结构要求所有指令长度必须是8的整数倍
(2)与使用定长指令集编码相比,当采用变长指令集编码时,该程序能够少占用多少存储器空间?
答案:(1)由于有142条指令,因此至少需要8位才能确定各条指令的操作码。20%的一个输入寄存器和一个输出寄存器指令需要18位,对齐到24位;30%的两个输入寄存器和一个输出寄存器需要23位,对齐到24位;25%的一个输入寄存器、一个输出寄存器、一个立即数寄存器指令需要34位,对齐到40位;25%的一个立即数输入寄存器和一个输出寄存器需要29位,对齐到32位;
(2)由于变长指令最长的长度为40位,所以定长指令编码每条指令的长度均为40位。而采用变长编码,平均长度为30位。能少占用25%的存储空间。
例题:假设指令字长为16位,操作数的地址码为6位,指令有零地址、一地址、二地址三种格式。
(1)设操作码固定,若零地址指令有M种,一地址指令有N种,则二地址指令最多有几种
(2)采用扩展操作码技术,二地址指令最多有几种
(3)采用扩展操作码技术,若二地址指令有P条,零地址指令有Q条,则一地址指令最多有几种
答案:(1)16-M-N;(2)15种;(3)(16-P)x 2^6-Q x 2 ^(-6);二地址指令操作码每减少一个,可多构成2 ^6条一地址指令操作码;一地址指令操作码每减少一个,可多构成2 ^6条零地址指令操作码;
例题:在一个36位长的指令系统中,设计一个扩展操作码,使之能表示下列指令:
(1)7条具有两个15位地址和一个3位地址的指令
(2)500条具有一个15位地址和一个3位地址的指令
(3)50条无地址指令
答案:
例题:某模型机共有64种操作码,位数固定,且具有以下特点:
(1)采用一地址或二地址格式
(2)有寄存器寻址、直接寻址和相对寻址(位移量为-128~+127)3种寻址方式
(3)有16个通用寄存器,算术运算和逻辑运算的操作数均在寄存器中,结果也在寄存器中
(4)取数/存数指令在通用寄存器和存储器之间传送数据
(5)存储器容量为1MB,按字节编址
要求设计算术逻辑指令,取数/存数指令和相对转移指令的格式,并简述理由
答案:应有寻址特征位;
4.2 指令的寻址方式
寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。
指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址A。形式地址结合寻址方式,可计算出操作数在存储器中的真实地址,这种地址称为有效地址EA。
4.2.1 指令寻址和数据寻址
寻找下一条将要执行的指令地址称为指令寻址; 寻找操作数的地址称为数据寻址。
1.指令寻址
指令寻址方式有两种:顺序寻址方式与跳跃寻址方式。
(1)顺序寻址可通过PC+1(1个指令字长),自动形成下一条指令的地址
(2)跳跃寻址通过转移类指令实现。所谓跳跃,是指下一条指令的地址码不由程序计数器给出,而由本条指令给出下条指令地址的计算方式。 是否跳跃可能受状态寄存器和操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC值,所以下一条指令仍然通过PC给出。
2.数据寻址
为区别数据寻址的不同方式,通常在指令字中设一个字段,用来指明属于哪种寻址方式。
4.2.2 常见的数据寻址方式
1.隐含寻址
这种类型的指令不明显地给出操作数的地址,而在指令中隐含操作数的地址。 例如,单地址的指令格式就不明显地在地址字段中指出第二操作数的地址,而规定累加器ACC作为第二操作数地址,指令格式明显指出的仅是第一操作数的地址。因此,累加器ACC对单地址指令格式来说是隐含寻址。
隐含寻址的优点是有利于缩短指令字长;缺点是需增加存储操作数或隐含地址的硬件。
2.立即(数)寻址
这种类型的指令的地址字段指出的不是操作数的地址,而是操作数本身,又称立即数。 数据采用补码形式存放。
#表示立即寻址特征,A就是操作数本身
立即寻址的优点是指令在执行阶段不访问主存,指令执行时间最短; 缺点是A的位数限制了立即数的范围。
3.直接寻址
指令字中的形式地址A是操作数的真实地址EA,即EA=A
直接寻址的优点是简单,指令在执行阶段仅访问一次主存,不需要专门计算操作数的地址;缺点是A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改。
4.间接寻址
指令的地址字段给出的形式地址不是操作数的真实地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)。间接寻址可以是一次间接寻址,也可是多次间接寻址。
在图中两次间接寻址中,主存字第一位为1时,表示取出的仍不是操作数的地址,即多次间址;主存字第一位为0时,表示取得的是操作数的地址。 (当多次间接寻址时,可用存储字的首位来标志间接寻址是否结束,存储字的首位不能作为EA的组成部分)
间接寻址的优点是可扩大寻址范围(有效地址EA的位数大于形式地址A的位数), 便于编制程序(用间接寻址可方便地完成子程序返回);缺点是指令在执行阶段要多次访存(一次间接寻址需2次访存,多次间接寻址需根据存储字的最高位确定访存次数)。 由于访问速度过慢,这种寻址方式并不常用。一般问到扩大寻址范围时,通常指的是寄存器间接寻址。
5.寄存器寻址
寄存器寻址是指在指令字中直接给出操作数所在的寄存器的编号,即EA=Ri,其操作数在由Ri所指的寄存器内。