第十三讲 指令系统
计算机功能
- 计算机的基本功能是执行程序
- 程序由存储在内存中的一组指令组成
- CPU通过执行指定的指令来完成实际工作
指令集: CPU能执行的各种不同指令的集合
指令
指令的要素
- 操作码: 指定将要完成的操作
- 源操作数引用: 操作会涉及一个或多个源操作数,这是操作所需的输入
- 结果操作数引用: 操作可能会产生一个结果
- 下一指令引用: 告诉处理器这条指令执行完成后到哪儿去取下一条指令
寻址方式
一些记号
A: 指令中地址字段的内容
R: 指向寄存器的指令地址字段的内容
EA: 被访问位置的实际(有效)地址
(X): 存储器位置X或寄存器X的内容
立即寻址
- 方法: 操作数实际出现在指令中
- 用法: 定义和使用常数或设置变量的初始值
- 算法: 操作数 = A
- 优点: 除了取指令之外,获得操作数不要求另外的存储器访问
- 缺点: 数的大小受限于地址字段的长度
直接寻址
- 方法: 地址字段含有操作数的有效地址
- 用法: 早期计算机常用,在当代计算机体系结构中不多见
- 算法: EA = A
- 优点: 只要求1次存储器访问,且无需为生成地址而专门计算
- 缺点: 地址空间是有限的
间接寻址
- 方法: 地址字段指示一个存储器字地址, 而此地址处保存有操作数的全长度地址
- 算法: EA = (A)
- 优点: 扩大了地址空间
- 缺点: 取操作数需要2次访问存储器
- 限制地址引用的数量, 防止无限循环寻址
寄存器寻址
- 方法: 地址字段指示的是寄存器
- 算法: EA = R
- 优点: 指令中仅需要一个较小的地址字段, 且不需要存储器访问
- 缺点: 地址空间十分有限
- 寄存器寻址只有在被有效使用的时候才有意义
寄存器间接寻址
- 方法: 地址字段指示的是寄存器, 寄存器中保存有操作数的全长度地址
- 算法: EA = (R)
- 优点: 扩大了地址空间,比间接寻址少1次存储器访问
- 缺点: 相对于寄存器寻址,需要多1次存储器访问
偏移寻址
- 方法: 结合直接寻址和寄存器间接寻址能力
- 算法: EA = (R) + A
- 类型
- 相对寻址
- 基址寄存器寻址
- 变址
- 偏移寻址要求指令有两个地址字段,至少其中一个是显式的
相对寻址
- 方法: 隐含引用的寄存器是程序计数器
- 用法: 大多数存储器访问都相对靠近正在执行的指令,相对寻址可节省指令中的地址位数
- 算法: EA = (PC) + A
- 优点: 利用程序局部性原理,节省指令中地址的位数
基址寄存器寻址
- 方法: 被引用的寄存器含有一个存储器地址,地址字段含有一个相对于那个地址的偏移量(通常是无符号整数表示)
- 用法: 虚拟内存空间中的程序重定位
- 算法: EA = (B) + A
变址寻址
- 方法: 指令地址字段引用一个主存地址,被引用的寄存器含有对于该地址的一个正的偏移量
- 用法: 为完成重复操作提供一种高效机制
- 算法: EA = A + (R)
栈寻址
- 方法: 栈指针保存在寄存器中,对寄存器中栈位置的访问实际上是一种寄存器间接寻址方式
指令格式
- 指令格式通过它的各个构成部分来定义指令的位安排
- 一个指令格式必须包含一个操作码,以及隐式或显式的、零个或多个操作数
- 指令格式必须显式或隐式地为每个操作数指定其寻址方式
- 大多数指令集使用不止一种指令格式
设计原则
- 指令尽量短
- 有足够的操作码位数
- 操作码的编码必须有唯一的解释
- 指令长度是字节的整数倍
- 合理选择地址字段的个数
- 指令尽量规整
指令长度
- 最明显的权衡考虑是在强有力的指令清单和节省空间之间进行
- 编程人员希望更多的操作码、更多的操作数、更多的寻址方式和更大的地址范围
- 指令长度变短可以节省存储空间和减少数据传送时间
- 指令长度应该是字符长度或定点数长度的整数倍
- 指令长度应该等于存储器的传送长度(即数据总线宽度),或者这两个值其中之一是另一个的整数倍
指令集设计
设计的基本原则
- 完备性/完整性:操作类型应当尽可能完备,但太复杂了也会给硬件实现增加困难
- 兼容性:应当兼容以前的指令系统,为软件重复利用带来方便
- 均匀性:应当能对多种类型的数据进行处理
- 可扩充性:操作码要预留一定的编码空间
设计的基本问题
- 操作指令表:应提供多少和什么样的操作,操作有多复杂
- 数据类型:对哪几种数据类型完成操作
- 指令格式:指令的位长度、地址数目、各个字段的大小等
- 寄存器:能被指令访问的寄存器数目以及它们的用途
- 寻址:寻址方式的种类以及有效地址的计算
- 下一条指令地址的确定:通常通过PC寄存器实现