# 指令系统

# 指令系统设计

# 一条指令必须包含的信息

  1. 操作码
  2. 源操作数参照
  3. 结果值参照
  4. 下一条指令参照

# 地址码字段个数

  1. 零地址指令
    • 无需操作数,如空操作、停机等
    • 所需操作数默认
  2. 一地址指令
    • 单目运算
    • 双目运算,另一操作数默认
  3. 二地址指令
    * 分别存放双目运算中两个操作数,并将其中一个地址作为结果的地址
  4. 三地址指令
    • 分别作为双目运算中两个源操作数的地址和一个结果的地址
  5. 多地址指令

# 操作数类型和存储方式

操作数基本类型

  1. 地址:无符号整数
  2. 数值数据
  3. 逻辑数据

# 寻址方式

地址码编码原则

  1. 指令地址码尽量短(目标代码短,省空间)
  2. 操作数存放位置灵活,空间应尽量大(有利于编译器优化产生高效代码)
  3. 有效地址计算简单(指令执行快)

# 基本寻址方式

OP R,A

  1. 立即数寻址
    指令就是操作数
  2. 直接寻址
    指令所需要的操作数位于内存中,在指令中直接给出操作数的有效地址。指令字的形式地址 A 就是操作数的真实地址 EA
  3. 间接寻址
    指令的形式地址是操作数有效地址所在存储单元的地址,即 EA=(A),形式地址里的内容所指向的地址才是操作数有效地址。
  4. 寄存器寻址
    在指令字中直接给出操作数所在寄存器地址,EA=R,操作数位于 R 所指的寄存器内
  5. 寄存器间接寻址
    与间接寻址类似,寄存器间接寻址给出操作数所在主存单元的地址,EA=(R)
  6. 相对寻址
    相对寻址是把程序计数器 PC 的内容加上指令格式中的形式地址 A 而形成操作数的有效地址。即 EA=(PC)+A,其中 A 是相对于当前地址的位移量,可正可负,补码表示。
  7. 基址寻址
    基址寻址是将 CPU 中基址寄存器(BR)的内容加上指令格式中的形式地址 A,而形成操作数的有效地址,EA=(BR)+A。其中基址寄存器既可采用专用寄存器,也可以采用通用寄存器。
  8. 变址寻址
    有效地址 EA 等于指令中的形式地址 A 与变址寄存器 IX 的内容相加之和,即 EA=(IX)+A,其中 IX 为变址寄存器(专用),也可用通用寄存器作为变址寄存器。
  9. 堆栈寻址
    堆栈是存储器(或专用寄存器组)中一块特定的按 “先进后出(LIFO)” 原则管理的存储区,该存储区中被读、写单元的地址是用特定的寄存器给出的,该寄存器称为堆栈指针(SP)。堆栈可分为硬堆栈和软堆栈两种。

寄存器堆栈又称为硬堆栈。寄存器堆栈的成本比较高,不适合做大容量的堆栈;而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。

寻址方式有效地址访存次数
立即寻址A 即是操作数0
直接寻址EA=A1
间接寻址EA=(A)2
寄存器寻址EA=R0
寄存器间接寻址EA=(R)1
相对寻址EA=(PC)+A1
基址寻址EA=(BR)+A1
变址寻址EA=(IX)+A1

当操作数位于内存中时,若发生了缺页,则操作数可能位于磁盘中

# 指令格式

操作码的编码有两种方式

  • 定长操作码法
  • 扩展操作码

操作码编码的选择:

  • 代码长度更重要时:选择变长指令字,变长操作码
  • 性能更重要时:采用定长指令字,定长指令字

变长指令字和操作码使机器代码更紧凑;定长指令字和操作码便于快速访问和译码

# 定长编码

# 基本思想

指令的操作码部分采用固定长度的编码

# 特点

译码方便,但有信息冗余

# 扩展编码

# 基本思想

将操作码的编码长度分成几种固定长的格式。被大多数指令集采用。

二地址指令: (0000~1110)

一地址指令:11110 (00000~11111);11111 (00000~00001)

零地址指令:11111 (00010~11111) (000000~111111)

故零地址指令最多有 302630*2^6

# 四种基本条件码

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

image-20240114132535641

两个操作数和结果都在寄存器的运算指令中

image-20240114133451475

# I-Type

image-20240114132746172

I 型指令是立即数型指令,其中包含一个立即数(常数值)作为操作数,以及一个或两个寄存器操作数

# J-Type

image-20240114132822203

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)。

image-20240114133430858

# MIPS 寻址方式

image-20240114133710709

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 分别为:$a1\$a1$t7\$t7$s0\$s0
故对应的汇编形式为:
add $s0\$s0$a1\$a1$t7\$t7

# R-Type 指令实现电路的执行过程

准备阶段

  • 装入指令寄存器 IR
  • 以下相应字段送控制逻辑
    • op field (OP 字段)
    • func field (func 字段)
    • shmt field (shmt 字段)
  • 以下相应字段送寄存器
    • 第一操作数寄存器编号
    • 第二操作数寄存器编号
    • 存放结果的目标寄存器编号

执行阶段

  • 寄存器号被送选择器
  • 对应选择器输出被激活
  • 被选寄存器的输出送到数据线
  • 控制逻辑提供:
    • ALU 操作码
    • 写信号 等
  • 结果被写回目标寄存器