14.Instruction Sets
指令: 是指示计算机执行某种操作的命令, 是计算机运行的最小功能单位. 一台计算机的所有指令的集合构成该机的指令系统, 也称为指令集. 一台计算机只能执行自己指令系统中的指令, 不能执行其他系统的指令
周期: 取指令, 译码/取寄存器, 执行/有效地址/完成分支, 访问内存, 存储结果
指令格式
操作码(OP) + 地址码(A)
根据地址码数目
零地址指令
一地址指令
二地址指令
三地址指令
四地址指令
根据指令长度
-
指令字长: 一条指令的总长度(可能会变)
-
机器字长: CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
-
存储字长: 一个存储单元中的二进制代码位数(通常和MDR位数相同)
-
半字长指令, 单字长指令, 双字长指令 —— 表示指令长度是机器字长的多少倍
定长指令字结构
-
指令系统中所有指令的长度都相等
变长指令字结构
-
指令系统中各种指令的长度不等
根据操作码长度
定长操作码
-
指令系统中所有指令的操作码长度都相同
-
控制器的译码电路设计简单, 但灵活性较低
可变长操作码
-
指令系统中各指令的操作码长度可变
-
控制器的译码电路设计复杂, 但灵活性较高
定长指令字结构 + 可变长操作码 —— 扩展操作码指令格式(不同地址数的指令使用不同长度的操作码)
根据操作类型
数据传送类
-
进行主存与CPU之间的数据传送
运算类
-
算术逻辑操作
-
移位操作
程序控制类
-
改变程序执行的顺序
输入输出类(I/O)
-
进行CPU和I/O设备之间的数据传送
扩展操作码设计
-
一种设计方案
-
设计扩展操作码指令格式的注意事项
- 不允许短码是长码的前缀, 即短操作码不能与长操作码的前面部分的代码相同 (类比哈夫曼树)
- 各指令的操作码一定不能重复
-
优点
- 在指令字长有限的前提下仍保持比较丰富的指令种类
-
缺点
- 增加了指令译码和分析的难度, 使控制器的设计复杂化
例题
指令寻址
下一条欲执行指令的地址(始终由程序计数器PC给出)
顺序寻址
定长指令字结构
变长指令字结构
跳跃寻址
数据寻址
确定本条指令的地址码指明的真实地址
直接寻址
-
指令字中的形式地址A就是操作数的真实地址EA, 即EA = A
-
一条指令的执行, 共访存2次
- 取指令 访存1次
- 执行指令 访存1次
- 不考虑存入ACC
-
优点: 简单, 指令执行阶段仅访问一次主存, 不需专门计算操作数的地址
-
缺点: A的位数决定了该指令操作数的寻址范围, 操作数的地址不易修改
间接寻址
-
指令的地址字段给出的形式地址不是操作数的真正地址, 而是操作数有效地址所在的存储单元的地址, 也就是操作数地址的地址, 即EA(A) = A
-
优点
- 可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)
- 便于编制程序(用间接寻址可以方便地完成子程序返回)
-
缺点
- 指令在执行阶段要多次访存(一次间址需两次访存, 多次寻址需根据存储字的最高位确定几次访存)
寄存器寻址
-
在指令字中直接给出操作数所在的寄存器编号, 即EA = Ri, 其操作数在由Ri所指的寄存器内
-
优点: 指令在执行阶段不访问主存, 只访问寄存器, 指令字短且执行速度块, 支持向量/矩阵运算
-
缺点: 寄存器价格贵, 计算机中寄存器个数有限
寄存器间接寻址
-
寄存器Ri中给出的不是一个操作数, 而是操作数所在主存单元的地址, 即EA = (Ri)
-
特点: 与一般间接寻址相比速度更快, 但指令的执行阶段需要访问主存(因为操作数在主存中)
隐含寻址
-
不是明显地给出操作数的地址, 而是在指令中隐含着操作数的地址
-
优点: 有利于缩短指令字长
-
缺点: 需增加存储操作数或隐含地址的硬件
立即寻址
-
形式地址A就是操作数本身, 又称为立即数, 一般采用补码形式. #表示立即寻址特征
-
优点: 指令执行阶段不访问主存, 指令执行时间最短
-
缺点: A的位数限制了立即数的范围
- 如A的位数为n, 且立即数采用补码时, 可表示的数据范围为 -2n-1 ~ 2n-1 - 1
偏移寻址
区别在于偏移的"起点"不一样
基址寻址
-
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A, 而形成操作数的有效地址, 即EA = (BR) + A
-
优点
- 可扩大寻址范围(基址寄存器的位数大于形式地址A的位数)
- 用户不必考虑自己的程序存于主存的哪一空间区域, 故有利于多道程序设计, 以及可用于编制浮动程序(整个程序在内存里的浮动)
拓展: 程序运行前, CPU将BR的值修改为该程序的起始地址
BR面向操作系统, 不允许用户或程序员更改
变址寻址
-
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和, 即EA = (IX) + A, 其中IX可为变址寄存器(专用), 也可用通用寄存器作为变址寄存器
-
作用
-
基址&变址复合寻址
变址寄存器是面向用户的, 在程序执行过程中, 变址寄存器的内容可由用户改变(IX作为偏移量), 形式地址A不变(作为基地址)
相对寻址
-
把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址, 即EA = (PC) + A, 其中A是相对于PC所指地址的位移量, 可正可负, 补码表示
-
优点: 操作数的地址不是固定的, 它随着PC指的变化而变化, 并且与指令地址之间总是相差一个固定值, 因此便于程序浮动(一段代码在程序内部的浮动)
-
作用
堆栈寻址
-
操作数存放在堆栈中, 隐含使用堆栈指针(SP)作为操作数地址