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)作为操作数地址
 




































