# 第7章 指令系统
> 📖 本章介绍机器指令系统的分类、寻址方式和指令格式设计。
> 🎯 重点理解寻址方式和指令格式设计
---
## 📋 本章目录
- [[#7.1 机器指令]]
- [[#7.2 操作数类型和操作类型]]
- [[#7.3 寻址方式]]
- [[#7.4 指令格式]]
- [[#7.5 RISC技术]]
- [[#本章小结]]
---
## 7.1 机器指令
### 7.1.1 指令的一般格式
> [!info] 定义
> 机器指令是计算机能识别和执行的基本命令,由操作码和地址码组成。
```mermaid
graph LR
subgraph "指令格式"
OP[操作码] --> ADDR[地址码]
end
```
#### 操作码
**功能**:指明指令要完成的操作
**长度**:
- **固定长度**:便于硬件设计,译码快
- **可变长度**:节省空间,译码复杂
#### 地址码
**功能**:指出操作数地址、结果地址、下条指令地址
**格式分类**:
```mermaid
graph TB
A[指令格式] --> B[四地址指令]
A --> C[三地址指令]
A --> D[二地址指令]
A --> E[一地址指令]
A --> F[零地址指令]
```
| 格式 | 地址字段 | 操作 | 访存次数 |
|------|----------|------|----------|
| 四地址 | A1, A2, A3, A4 | (A1)OP(A2)→A3 | 4次 |
| 三地址 | A1, A2, A3 | (A1)OP(A2)→A3 | 4次 |
| 二地址 | A1, A2 | (A1)OP(A2)→A1 | 4次 |
| 一地址 | A1 | ACCOP(A1)→ACC | 2次 |
| 零地址 | 无 | 栈操作 | 0-2次 |
> [!example] 示例
> 四地址指令:OP A1 A2 A3 A4
> - (A1) OP (A2) → A3
> - 下条指令地址 = A4
### 7.1.2 扩展操作码技术
> [!info] 目的
> 在指令字长固定的情况下,增加指令种类。
**原理**:操作码长度随地址数减少而增加
```mermaid
graph TB
subgraph "扩展操作码示例(16位指令)"
A["4位操作码
15条三地址指令"] --> B["8位操作码
15条二地址指令"]
B --> C["12位操作码
15条一地址指令"]
C --> D["16位操作码
16条零地址指令"]
end
```
**设计原则**:
- 使用频度高的指令用短操作码
- 使用频度低的指令用长操作码
- 为扩展留有余地
---
## 7.2 操作数类型和操作类型
### 7.2.1 操作数类型
| 类型 | 说明 | 示例 |
|------|------|------|
| 地址 | 无符号整数 | 指向存储器位置 |
| 数值 | 定点数、浮点数 | 算术运算 |
| 字符 | ASCII码 | 文本处理 |
| 逻辑数 | 位串 | 逻辑运算 |
### 7.2.2 操作类型
#### 数据传送类
| 指令 | 功能 | 示例 |
|------|------|------|
| MOV | 数据传送 | MOV AX, BX |
| LOAD | 从存储器取数 | LOAD R1, [addr] |
| STORE | 存数到存储器 | STORE [addr], R1 |
| PUSH/POP | 栈操作 | PUSH AX |
#### 算术逻辑类
| 指令 | 功能 | 示例 |
|------|------|------|
| ADD/SUB | 加/减 | ADD AX, BX |
| MUL/DIV | 乘/除 | MUL BX |
| AND/OR/NOT | 逻辑运算 | AND AX, BX |
| CMP | 比较 | CMP AX, BX |
| SHL/SHR | 移位 | SHL AX, 1 |
#### 控制转移类
| 指令 | 功能 | 示例 |
|------|------|------|
| JMP | 无条件跳转 | JMP addr |
| JZ/JNZ | 条件跳转 | JZ addr |
| CALL | 调用子程序 | CALL addr |
| RET | 返回 | RET |
| INT | 中断 | INT 21H |
---
## 7.3 寻址方式
> [!info] 定义
> 寻址方式是指令中如何给出操作数地址或操作数的方式。
### 7.3.1 指令寻址
#### 顺序寻址
```mermaid
graph LR
PC[PC] --> |"PC+1"| NEXT[下一条指令]
```
#### 跳跃寻址
```mermaid
graph LR
PC[PC] --> |"JMP addr"| TARGET[目标指令]
```
### 7.3.2 数据寻址
**指令格式**:
```mermaid
graph LR
subgraph "数据寻址格式"
OP[操作码] --> MOD[寻址特征] --> ADDR[形式地址]
end
```
**有效地址**:$EA = f(寻址方式, 形式地址)$
#### 常见寻址方式
##### 1. 立即寻址
> [!info] 特点
> 操作数直接在指令中
**格式**:OP #立即数
**有效地址**:$EA = 指令地址 + 1$(操作数在指令中)
**优点**:速度快,不需要访存
**缺点**:操作数范围受地址字段限制
##### 2. 直接寻址
> [!info] 特点
> 地址字段直接给出操作数地址
**格式**:OP A
**有效地址**:$EA = A$
**优点**:简单,只需一次访存
**缺点**:寻址范围受地址字段限制
##### 3. 间接寻址
> [!info] 特点
> 地址字段给出的是操作数地址的地址
**格式**:OP (A)
**有效地址**:$EA = (A)$
**优点**:寻址范围大
**缺点**:多次访存,速度慢
```mermaid
graph LR
A[形式地址A] --> |"第一次访存"| B[地址B]
B --> |"第二次访存"| C[操作数]
```
##### 4. 寄存器寻址
> [!info] 特点
> 操作数在寄存器中
**格式**:OP R
**有效地址**:$EA = R$
**优点**:速度快,不需要访存
**缺点**:寄存器数量有限
##### 5. 寄存器间接寻址
> [!info] 特点
> 寄存器中存放的是操作数的地址
**格式**:OP (R)
**有效地址**:$EA = (R)$
**优点**:寻址范围大,只需一次访存
**缺点**:需要一次访存
##### 6. 偏移寻址
###### 基址寻址
**格式**:OP A,基址寄存器BR
**有效地址**:$EA = (BR) + A$
**特点**:
- 便于程序重定位
- 基址寄存器内容不变
- 形式地址可变
###### 变址寻址
**格式**:OP A,变址寄存器IX
**有效地址**:$EA = (IX) + A$
**特点**:
- 便于数组操作
- 变址寄存器内容可变
- 形式地址不变
> [!example] 数组访问示例
> 访问数组元素:$EA = (IX) + A$
> - A:数组首地址
> - IX:元素下标
> - 每次IX+1,访问下一个元素
###### 相对寻址
**格式**:OP A
**有效地址**:$EA = (PC) + A$
**特点**:
- 程序浮动
- A是相对于PC的偏移量
##### 7. 堆栈寻址
**格式**:PUSH/POP 操作数
**有效地址**:
- PUSH:先SP-1,再存数
- POP:先取数,再SP+1
**特点**:后进先出(LIFO)
#### 寻址方式对比
| 寻址方式 | 有效地址 | 访存次数 | 优点 | 缺点 |
|----------|----------|----------|------|------|
| 立即寻址 | 操作数在指令中 | 0 | 速度快 | 范围小 |
| 直接寻址 | EA=A | 1 | 简单 | 范围小 |
| 间接寻址 | EA=(A) | 2+ | 范围大 | 速度慢 |
| 寄存器寻址 | EA=R | 0 | 速度最快 | 数量有限 |
| 寄存器间接 | EA=(R) | 1 | 范围大 | 需要访存 |
| 基址寻址 | EA=(BR)+A | 1 | 便于重定位 | 需要基址寄存器 |
| 变址寻址 | EA=(IX)+A | 1 | 便于数组操作 | 需要变址寄存器 |
| 相对寻址 | EA=(PC)+A | 1 | 程序浮动 | 范围有限 |
| 堆栈寻址 | 栈顶 | 0-1 | 自动管理 | 只能栈操作 |
---
## 7.4 指令格式
### 7.4.1 指令格式设计考虑因素
| 因素 | 考虑内容 |
|------|----------|
| 指令字长 | 固定/可变,长度选择 |
| 操作码 | 固定/可变,长度分配 |
| 地址码 | 地址个数,寻址方式 |
| 数据类型 | 支持的数据类型 |
| 寻址方式 | 提供哪些寻址方式 |
### 7.4.2 指令字长
**固定字长**:
- 优点:取指时间固定,硬件简单
- 缺点:浪费空间
**可变字长**:
- 优点:节省空间
- 缺点:取指时间不固定
### 7.4.3 指令格式举例
#### IBM 370指令格式
```mermaid
graph LR
subgraph "IBM 370 指令格式"
OP[操作码8位] --> R1[寄存器1] --> R2[寄存器2] --> B2[基址寄存器] --> D2[位移量]
end
```
**特点**:
- 固定操作码长度(8位)
- 基址+位移寻址
- 16个通用寄存器
#### Intel 8086指令格式
```mermaid
graph LR
subgraph "Intel 8086 指令格式"
OP[操作码] --> MOD[寻址方式] --> R/M[寄存器/存储器] --> DISP[位移量]
end
```
**特点**:
- 可变操作码长度
- 多种寻址方式
- 8个通用寄存器
### 7.4.4 指令系统设计原则
1. **完备性**:指令功能完整
2. **规整性**:指令格式统一
3. **对称性**:操作对称
4. **可扩充性**:便于扩展
5. **兼容性**:向上兼容
---
## 7.5 RISC技术
### 7.5.1 RISC与CISC
| 特性 | CISC | RISC |
|------|------|------|
| 指令数量 | 多(几百条) | 少(几十条) |
| 指令长度 | 可变 | 固定 |
| 寻址方式 | 多种 | 少数几种 |
| 执行时间 | 不固定 | 固定(一个周期) |
| 访存方式 | 多种指令可访存 | 只有LOAD/STORE |
| 控制方式 | 微程序 | 硬布线 |
| 优化目标 | 缩短程序长度 | 提高执行速度 |
### 7.5.2 RISC特点
**主要特点**:
1. **指令数量少**:只包含常用指令
2. **指令长度固定**:简化取指和译码
3. **寻址方式少**:简化寻址逻辑
4. **只有LOAD/STORE访存**:简化数据通路
5. **大量寄存器**:减少访存次数
6. **硬布线控制**:提高执行速度
7. **流水线技术**:提高并行度
8. **优化编译**:充分利用硬件
### 7.5.3 RISC优势
| 优势 | 说明 |
|------|------|
| 速度快 | 指令执行时间固定,便于流水线 |
| 硬件简单 | 控制逻辑简单,成本低 |
| 设计周期短 | 指令少,验证容易 |
| 功耗低 | 逻辑简单,功耗小 |
### 7.5.4 RISC vs CISC对比
```mermaid
graph TB
subgraph "CISC"
A1[复杂指令] --> B1[微程序执行]
B1 --> C1[多周期]
end
subgraph "RISC"
A2[简单指令] --> B2[硬布线执行]
B2 --> C2[单周期]
C2 --> D2[流水线]
end
```
---
## 📝 本章小结
### 核心概念
1. **指令格式**:操作码 + 地址码
2. **寻址方式**:立即、直接、间接、寄存器、基址、变址、相对、堆栈
3. **指令系统设计**:完备性、规整性、可扩充性
4. **RISC技术**:简化指令,提高速度
### 关键公式
- **有效地址**:$EA = f(寻址方式, 形式地址)$
- **基址寻址**:$EA = (BR) + A$
- **变址寻址**:$EA = (IX) + A$
- **相对寻址**:$EA = (PC) + A$
### 重点图示
> [!summary] 必须掌握的内容
> 1. 指令格式分类(四地址到零地址)
> 2. 扩展操作码技术
> 3. 各种寻址方式的计算方法
> 4. RISC与CISC的区别
---
## 🧪 自测练习
### 概念题
1. 比较各种指令格式的特点。
2. 说明扩展操作码技术的原理。
3. 解释RISC技术的主要特点。
### 计算题
1. 给定指令字长和操作数地址,设计扩展操作码。
2. 计算各种寻址方式下的有效地址。
### 分析题
1. 设计一个简单的指令系统。
2. 分析RISC和CISC的优缺点。
---
## 🔗 相关链接
- [[06_运算方法]] - 上一章
- [[08_CPU结构与功能]] - 下一章
- [[10_控制单元设计]] - 指令执行
- [[04_存储器]] - 存储器访问
---
*本章难度:⭐⭐⭐⭐ 中等偏难*
*重要程度:⭐⭐⭐⭐ 重点*