# 第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位操作码<br/>15条三地址指令"] --> B["8位操作码<br/>15条二地址指令"]
        B --> C["12位操作码<br/>15条一地址指令"]
        C --> D["16位操作码<br/>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_存储器]] - 存储器访问

---

*本章难度：⭐⭐⭐⭐ 中等偏难*
*重要程度：⭐⭐⭐⭐ 重点*