- 指令系统是指一台计算机的所有指令的集合。
- 指令系统是指令集体系结构(ISA)中最核心的部分。
ISA完整定义了软件与硬件之间的接口,内容主要包括:指令格式、数据类型及格式、操作数的存放方式、程序可访问的寄存器的个数、位数、编号以及存储空间的大小和编址方式,还包括寻址方式、指令执行过程的控制方式等。但是其并没有规定CPU的时钟周期或者加法器的进位方式等等,因为这些属于计算机硬件设计的范畴。
1.指令的基本格式
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。
1.1 指令结构
- 一条指令主要包括操作码和地址码字段。
- 操作码用于指明该条指令执行什么样性质的操作,是识别指令、了解指令功能、区分操作数内容的组成和使用方法的关键信息。比如:是算术加法运算还是算术减法运算、是程序转移还是程序返回…
- 地址码指出被操作的指令或数据的地址。比如:参与运算的一个或多个操作数的地址、运算结果的保持地址、程序的转移地址、被调用的子程序的入口地址…
1.2 特点
- 指令长度 = 一条指令所包含的二进制代码的位数。
- 指令字长取决于操作码的长度、操作数地址的个数、操作数地址的长度。
- 指令字长与机器字长无关。
- 指令字长 = 机器指令的指令称为单字长指令;指令字长 = 机器指令 / 2的指令称为半字长指令;指令字长 = 2 × 机器指令的指令称为双字长指令。
- 定长指令字结构中,所有指令长度相等,带来的好处是执行速度快、控制简单。
- 变长指令字结构中,各种指令的长度因功能而异。(由于多数主存按字节编址,因此指令字长 = 字节的整数倍)
- 为了硬件设计方便,指令字长一般取字节或存储字长的整数倍,而不一定都和存储字长一样大。
1.3 分类(按操作数数量划分)
1.3.1 零地址指令
1.3.1.1 特点
- 只有操作码,无显式地址。
- 零地址的运算类指令值用于堆栈计算机中,其参与运算的两个操作数分别来自栈顶和次栈顶。
1.3.1.2 栗子🌰
空操作指令、停机指令、关中断指令…
1.3.2 一地址指令
1.3.2.1 特点
由操作码和一个显式操作数地址组成。
1.3.2.2 栗子🌰
- 只有目的操作数的单操作数指令:++、–、求反、求补…含义:对操作数A1进行OP后,再将结果存回A1( OP(A1) -> A1 )。
- 同时具有隐含目的地址的双操作数指令,其中之一的隐含操作数来源于ACC(累加寄存器),最终结果也存放在ACC中。含义:(ACC)OP(A1) -> ACC。
1.3.3 二地址指令
1.3.3.1 特点
由一个操作码和两个操作数地址组成,两个操作数将分别给出目的操作数和源操作数地址,其中目的操作数用于保存本次运算的结果。
1.3.3.2 指令含义
(A1)OP(A2) -> A1。
1.3.4 三地址指令
1.3.4.1 说明
若指令字长占32位,且操作码占8位,则剩余的三个地址码均占(32 - 8) / 3 = 8位。
1.3.4.2 指令含义
(A1)OP(A2) -> A3。
1.3.5 四地址指令
1.3.5.1 特点
指令的地址码字段(最后一个操作数)中包含一个下一条将要被执行的指令的地址。
1.3.4.2 指令含义
(A1)OP(A2) -> A3。
2.定长操作码指令格式
- 将指令字固定高位的若干位表示操作码。
- n位操作码字段意味着最大能够表示 2n 条指令。
- 定长操作码有利于简化计算机硬件设计、提高指令译码和识别的速度。
3.扩展操作码指令格式
3.1 特点
- 全部指令的操作码字段的位数不固定、且分散于指令字的不同位置上。
- 常见的拓展方法:使操作码字段的长度随地址码的减小而增加,不同地址数的指令可具有不同长度的操作码。
- 短操作码与长操作码的前面部分代码(前缀)一定不同。
3.2 说明
注意:操作码短的要为后面操作码长的指令的拓展空出一个位出来(如上图中的三地址指令为二地址指令预留出了1111),防止短操作数的指令与长操作数的指令因前缀相同而只能优先匹配前者的问题。
通常情况下,会为使用频度高的指令分配较短的操作码,为使用频道较低的分配较长的操作码,从而尽可能减少指令译码和分析的时间。
4.指令的操作类型
数据传送
- 寄存器->寄存器(MOV)(传送)
- 主存单元 -> 寄存器(LOAD)(读取)
- 寄存器 -> 主存单元(STORE)(写回)
算术和逻辑运算
- 加(ADD)
- 减(SUB)
- 乘(MUL)
- 除(DIV)
- ++(INC)
- –(DEC)
- 比较(CMP)
- 与(AND)
- 或(OR)组合
- 非(NOT)
- 异或(XOR)
移位操作
- 算术移位
- 逻辑移位
- 循环移位
转移操作
- 无条件转移(JMP)
- 条件转移(BRANCH)(转移条件一般是某个标志位的值或几个标志位的组合)
- 调用(CALL)
- 返回(RET)
- 陷阱(TRAP)
CALL与JML或BRACNCH的区别
执行CALL时,必须保存下一条指令的地址(返回地址),以便子程序结束时再回到返回地址处继续执行;而JML或BRANCH则不返回执行。
输入输出操作
说明
用于完成CPU与外部设备的数据交换工作、传送控制命令和状态信息。
PS
运算型指令寻址的是操作数;转移型指令寻址的是下次欲要执行的指令的地址。
程序转移类指令用于改变程序执行的顺序,并使程序具有测试、分析、判断和循环执行的能力。
特权指令只能被操作系统或系统软件使用,用户无权使用。