# 指令系统
# 指令系统设计
# 一条指令必须包含的信息
- 操作码
- 源操作数参照
- 结果值参照
- 下一条指令参照
# 地址码字段个数
- 零地址指令
- 无需操作数,如空操作、停机等
- 所需操作数默认
- 一地址指令
- 单目运算
- 双目运算,另一操作数默认
- 二地址指令
* 分别存放双目运算中两个操作数,并将其中一个地址作为结果的地址 - 三地址指令
- 分别作为双目运算中两个源操作数的地址和一个结果的地址
- 多地址指令
# 操作数类型和存储方式
操作数基本类型
- 地址:无符号整数
- 数值数据
- 逻辑数据
# 寻址方式
地址码编码原则
- 指令地址码尽量短(目标代码短,省空间)
- 操作数存放位置灵活,空间应尽量大(有利于编译器优化产生高效代码)
- 有效地址计算简单(指令执行快)
# 基本寻址方式
OP R,A
- 立即数寻址
指令就是操作数 - 直接寻址
指令所需要的操作数位于内存中,在指令中直接给出操作数的有效地址。指令字的形式地址 A 就是操作数的真实地址 EA - 间接寻址
指令的形式地址是操作数有效地址所在存储单元的地址,即 EA=(A),形式地址里的内容所指向的地址才是操作数有效地址。 - 寄存器寻址
在指令字中直接给出操作数所在寄存器地址,EA=R,操作数位于 R 所指的寄存器内 - 寄存器间接寻址
与间接寻址类似,寄存器间接寻址给出操作数所在主存单元的地址,EA=(R) - 相对寻址
相对寻址是把程序计数器 PC 的内容加上指令格式中的形式地址 A 而形成操作数的有效地址。即 EA=(PC)+A,其中 A 是相对于当前地址的位移量,可正可负,补码表示。 - 基址寻址
基址寻址是将 CPU 中基址寄存器(BR)的内容加上指令格式中的形式地址 A,而形成操作数的有效地址,EA=(BR)+A。其中基址寄存器既可采用专用寄存器,也可以采用通用寄存器。 - 变址寻址
有效地址 EA 等于指令中的形式地址 A 与变址寄存器 IX 的内容相加之和,即 EA=(IX)+A,其中 IX 为变址寄存器(专用),也可用通用寄存器作为变址寄存器。 - 堆栈寻址
堆栈是存储器(或专用寄存器组)中一块特定的按 “先进后出(LIFO)” 原则管理的存储区,该存储区中被读、写单元的地址是用特定的寄存器给出的,该寄存器称为堆栈指针(SP)。堆栈可分为硬堆栈和软堆栈两种。
寄存器堆栈又称为硬堆栈。寄存器堆栈的成本比较高,不适合做大容量的堆栈;而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。
寻址方式 | 有效地址 | 访存次数 |
---|---|---|
立即寻址 | A 即是操作数 | 0 |
直接寻址 | EA=A | 1 |
间接寻址 | EA=(A) | 2 |
寄存器寻址 | EA=R | 0 |
寄存器间接寻址 | EA=(R) | 1 |
相对寻址 | EA=(PC)+A | 1 |
基址寻址 | EA=(BR)+A | 1 |
变址寻址 | EA=(IX)+A | 1 |
当操作数位于内存中时,若发生了缺页,则操作数可能位于磁盘中
# 指令格式
操作码的编码有两种方式
- 定长操作码法
- 扩展操作码
操作码编码的选择:
- 代码长度更重要时:选择变长指令字,变长操作码
- 性能更重要时:采用定长指令字,定长指令字
变长指令字和操作码使机器代码更紧凑;定长指令字和操作码便于快速访问和译码
# 定长编码
# 基本思想
指令的操作码部分采用固定长度的编码
# 特点
译码方便,但有信息冗余
# 扩展编码
# 基本思想
将操作码的编码长度分成几种固定长的格式。被大多数指令集采用。
二地址指令: (0000~1110)
一地址指令:11110 (00000~11111);11111 (00000~00001)
零地址指令:11111 (00010~11111) (000000~111111)
故零地址指令最多有 种
# 四种基本条件码
SF,OF,ZF,CF
# 指令设计风格
# 按操作数位置划分
# 累加器型
其中一个操作数总在累加器中
# 堆栈型
总是将栈顶两个操作数进行运算,指令无需指定操作数地址
Java Virtual Machine 采用 Stack 型
# 通用寄存器型
操作数可以是寄存器或存储器数据
# 装入 / 存储型
操作数只能是寄存器数据,只有 load/store 能访问存储器
# 按指令格式的复杂度划分
# 复杂指令集计算机 CISC (Complex Instruction Set Computer)
(1) 指令系统复杂
指令多 / 寻址方式多 / 指令格式多
(2) 指令周期长
绝大多数指令需要多个时钟周期才能完成
(3) 各种指令都能访问存储器
除了专门的存储器读写指令外,运算指令也能访问存储器
(4) 采用微程序控制(程序设计思想)
(5) 有专用寄存器
(6) 难以进行编译优化来生成高效目标代码
# 精简指令集计算机 RISC (Reduce Instruction Set Computer)
(1) 简化的指令系统
指令少 / 寻址方式少 / 指令格式少 / 指令长度一致
(2) 以 RR 方式工作
除 Load/Store 指令可访问存储器外,其余指令都只访问寄存器。
(3) 指令周期短
以流水线方式工作,因而除 Load/Store 指令外,其他简单指令都只需一个或一个不到的时钟周期就可完成。
(4) 采用大量通用寄存器,以减少访存次数
(5) 采用组合逻辑电路控制,不用或少用微程序控制
(6) 采用优化的编译系统,力求有效地支持高级语言程序
# 程序的机器级表示
# MIPS 指令格式
# R-Type
两个操作数和结果都在寄存器的运算指令中
# I-Type
I 型指令是立即数型指令,其中包含一个立即数(常数值)作为操作数,以及一个或两个寄存器操作数
# J-Type
J 型指令是跳转型指令,用于实现无条件跳转。 J 型指令只包含一个目标地址作为操作数
# 字段含义
OP:操作码,op=0 表示 R 型,2 或 3 表示 J 型,其余为 I 型指令
rs:第一个源寄存器
rt:第二个源寄存器
rd:结果寄存器
shamt:移位指令的位移量
func:R-Type 指令的 OP 字段是特定的 “000000”,具体操作由 func 字段给定。例如:func=“100000” 时,表示 “加法” 运算
immediate:立即数或 load/store 指令和分支指令的偏移地址
target address:无条件转移地址的低 26 位。将 PC 高 4 位拼上 26 位直接地址,最后添 2 个 “0” 就是 32 位目标地址。为何最后两位要添 “0”?
指令按字地址对齐,所以每条指令的地址都是 4 的倍数(最后两位为 0)。
# MIPS 寻址方式
R 型指令采用寄存器寻址
I 型指令采用立即数寻址、基址或变址寻址、相对寻址
J 型指令目标地址在指令中的地址字段中
# 汇编形式和指令的对应
若从存储器取来一条指令为 00AF8020H,则对应的汇编形式是什么?
32 位指令代码:0000 0000 1010 1111 1000 0000 0010 0000
指令的前 6 位为 000000,根据指令解码表知,是一条 R-Type 指令,按照 R-Type 指令的格式
得到: rs=00101, rt=01111, rd=10000, shamt=00000, funct=100000
1. 根据 R-Type 指令解码表,知是 “add” 操作(非移位操作)
2. rs、rt、rd 的十进制值分别为 5、15、16,从 MIPS 寄存器功能表知:
rs、rt、rd 分别为:、、
故对应的汇编形式为:
add ,,
# R-Type 指令实现电路的执行过程
准备阶段
- 装入指令寄存器 IR
- 以下相应字段送控制逻辑
- op field (OP 字段)
- func field (func 字段)
- shmt field (shmt 字段)
- 以下相应字段送寄存器
- 第一操作数寄存器编号
- 第二操作数寄存器编号
- 存放结果的目标寄存器编号
执行阶段
- 寄存器号被送选择器
- 对应选择器输出被激活
- 被选寄存器的输出送到数据线
- 控制逻辑提供:
- ALU 操作码
- 写信号 等
- 结果被写回目标寄存器