# 第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次 |

地址码就像菜谱上的"材料"：四地址指令把A1和A2的数相加结果存到A3，下条指令在A4；三地址指令把A1和A2的数相加结果存到A3；二地址指令把A1和A2的数相加结果存到A1；一地址指令把ACC和A1的数相加结果存到ACC；零地址指令弹出栈顶两个数相加结果压入栈。

### 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
```

**设计原则**：
- 使用频度高的指令用短操作码
- 使用频度低的指令用长操作码
- 为扩展留有余地

扩展操作码就像邮政编码系统：短操作码常用指令用短编码节省空间，长操作码不常用指令用长编码种类多。4位操作码15条三地址指令（1111保留），8位操作码15条二地址指令，12位操作码15条一地址指令，16位操作码16条零地址指令。

---

## 7.2 操作数类型和操作类型

### 7.2.1 操作数类型

| 类型 | 说明 | 示例 |
|------|------|------|
| 地址 | 无符号整数 | 指向存储器位置 |
| 数值 | 定点数、浮点数 | 算术运算 |
| 字符 | ASCII码 | 文本处理 |
| 逻辑数 | 逻辑运算 | 位操作 |

地址是无符号整数指向存储器位置，用于寻址操作；数值是定点数或浮点数用于算术运算；字符是ASCII码用于文本处理；逻辑数用于逻辑运算和位操作。

### 7.2.2 操作类型

**数据传送**：LOAD（从存储器取数据到寄存器）、STORE（从寄存器存数据到存储器）

**算术逻辑运算**：ADD（加法）、SUB（减法）、AND（逻辑与）、OR（逻辑或）

**移位操作**：SHL（逻辑左移）、SHR（逻辑右移）、SAL（算术左移）、SAR（算术右移）

**转移操作**：JMP（无条件转移）、JZ（条件转移）、CALL（调用子程序）、RET（返回）

**输入输出**：IN（从I/O端口读数据）、OUT（向I/O端口写数据）

数据传送像从仓库取材料到工作台；算术逻辑运算像把两个数加起来或相减；移位操作像所有位向左移动；转移操作像跳转到指定位置；输入输出像从外部设备读数据。

---

## 7.3 寻址方式

### 7.3.1 指令寻址

**顺序寻址**：PC = PC + 1，按顺序执行指令
**跳跃寻址**：PC = 跳转地址，跳转到指定地址执行

指令寻址像找下一条指令的方式：顺序寻址按顺序执行下一条指令，跳跃寻址跳转到指定地址执行。

### 7.3.2 数据寻址

**立即寻址**：操作数在指令中，比如MOV A, #5（把5存到A）。东西就在你手里，速度快不需要访问内存，只能用于常数。

**直接寻址**：操作数地址在指令中，比如MOV A, [1000]（把地址1000的数存到A）。东西在仓库的某个位置，简单直接访问，地址范围有限。

**间接寻址**：操作数地址的地址在指令中，比如MOV A, [[1000]]。仓库里有一张纸条告诉你东西在哪里，灵活可以动态改变地址，但速度慢需要多次访问内存。

**寄存器寻址**：操作数在寄存器中，比如MOV A, R1（把R1的数存到A）。东西就在你手边的盒子里，速度最快不需要访问内存，寄存器数量有限。

**寄存器间接寻址**：操作数地址在寄存器中，比如MOV A, [R1]。盒子里有一张纸条告诉你东西在哪里，灵活可以动态改变地址，需要访问内存。

**基址寻址**：操作数地址 = 基址 + 偏移量，比如MOV A, [BASE + 100]。东西在仓库的某个区域，用区域号+偏移量定位，适合程序重定位。

**变址寻址**：操作数地址 = 变址 + 偏移量，比如MOV A, [INDEX + 100]。东西在仓库的某个位置，用变址+偏移量定位，适合数组访问。

**相对寻址**：操作数地址 = PC + 偏移量，比如JMP +10（跳转到PC+10的位置）。东西在当前位置的某个偏移位置，适合相对跳转。

---

## 7.4 指令格式

### 7.4.1 指令格式设计原则

**设计原则**：
1. **规整性**：指令长度对齐，便于译码
2. **高效性**：常用指令短，不常用指令长
3. **兼容性**：保持向后兼容
4. **扩展性**：留有扩展空间

指令格式设计就像设计邮票：规整性指令长度对齐便于译码，高效性常用指令短不常用指令长，兼容性新处理器能运行旧程序，扩展性保留一些编码用于未来扩展。

### 7.4.2 指令格式举例

**x86指令格式**：变长指令，格式复杂，代码密度高兼容性好，译码复杂。
**ARM指令格式**：固定长度指令，格式简单，译码简单速度快，代码密度低。

---

## 7.5 RISC技术

### 7.5.1 RISC与CISC对比

| 特性 | RISC | CISC |
|------|------|------|
| 指令数量 | 少 | 多 |
| 指令长度 | 固定 | 可变 |
| 寻址方式 | 简单 | 复杂 |
| 指令周期 | 单周期 | 多周期 |
| 流水线 | 支持 | 部分支持 |
| 编译器 | 复杂 | 简单 |

RISC（精简指令集）指令少简单速度快，容易实现流水线，但编译器复杂代码密度低；CISC（复杂指令集）指令多复杂功能强，编译器简单代码密度高，但难以实现流水线速度慢。

ARM处理器（手机）、MIPS处理器（嵌入式）是RISC；x86处理器（个人电脑）是CISC。

### 7.5.2 RISC特点

**主要特点**：
1. **指令数量少**：通常只有几十条指令
2. **指令长度固定**：所有指令长度相同
3. **寻址方式简单**：只有几种简单的寻址方式
4. **单周期执行**：大多数指令在一个周期内完成
5. **流水线支持**：容易实现流水线
6. **大量寄存器**：通常有32个以上寄存器
7. **硬布线控制**：用硬布线实现控制单元

指令数量少容易实现速度快但功能有限；指令长度固定译码简单容易实现流水线但代码密度低；寻址方式简单译码简单速度快但灵活性差；单周期执行速度快容易实现流水线但某些复杂指令需要多个周期；流水线支持提高吞吐率但需要处理流水线冲突；大量寄存器减少访存次数速度快但增加硬件成本；硬布线控制速度快但不灵活难以修改。

---

## 📝 本章小结

### 核心概念

1. **指令格式**：操作码 + 地址码
2. **寻址方式**：立即寻址、直接寻址、间接寻址等
3. **指令类型**：数据传送、算术逻辑、移位、转移、输入输出
4. **RISC技术**：精简指令集，速度快

### 关键术语

| 术语 | 英文 | 含义 |
|------|------|------|
| 指令 | Instruction | 机器指令 |
| 操作码 | Operation Code | 指明操作类型 |
| 地址码 | Address Code | 指明操作数地址 |
| 寻址方式 | Addressing Mode | 找到操作数的方式 |
| RISC | Reduced Instruction Set Computer | 精简指令集计算机 |
| CISC | Complex Instruction Set Computer | 复杂指令集计算机 |

### 重点图示

> [!summary] 必须掌握的图
> 1. 指令格式图
> 2. 各种寻址方式图
> 3. 扩展操作码图
> 4. RISC与CISC对比图

---

## 🧪 例题与解析

### 例题1：指令格式设计

**题目**：设计一个16位指令系统，要求支持15条三地址指令、15条二地址指令、15条一地址指令、16条零地址指令。

**答案**：

三地址指令：4位操作码（1111保留），3个×4位=12位地址码，指令数2⁴-1=15条。
二地址指令：8位操作码（1111xxxx，xxxx≠1111），2个×4位=8位地址码，指令数15条。
一地址指令：12位操作码（1111xxxxxxxx，xxxxxxxx≠11111111），1个×4位=4位地址码，指令数15条。
零地址指令：16位操作码（1111xxxxxxxxxxxx），0位地址码，指令数16条。

### 例题2：寻址方式分析

**题目**：分析以下指令的寻址方式：
1. MOV A, #5
2. MOV A, [1000]
3. MOV A, R1
4. MOV A, [R1]
5. MOV A, [BASE + 100]

**答案**：

1. MOV A, #5：立即寻址，操作数5在指令中，速度快不需要访问内存。
2. MOV A, [1000]：直接寻址，操作数在地址1000，简单直接访问。
3. MOV A, R1：寄存器寻址，操作数在寄存器R1，速度最快不需要访问内存。
4. MOV A, [R1]：寄存器间接寻址，R1指向的地址的数，灵活可以动态改变地址。
5. MOV A, [BASE + 100]：基址寻址，BASE+100的数，适合程序重定位。

### 例题3：RISC与CISC比较

**题目**：比较RISC和CISC的特点。

**答案**：

RISC指令数量少（几十条）、指令长度固定、寻址方式简单、单周期执行、支持流水线、编译器复杂、寄存器多、硬布线控制；CISC指令数量多（几百条）、指令长度可变、寻址方式复杂、多周期执行、部分支持流水线、编译器简单、寄存器少、微程序控制。

RISC像精简工具，工具少简单速度快，容易使用效率高但功能有限；CISC像复杂工具，工具多复杂功能强，功能强大使用方便但使用复杂效率低。

### 例题4：扩展操作码设计

**题目**：设计一个12位指令系统，要求支持15条二地址指令、15条一地址指令、16条零地址指令。

**答案**：

二地址指令：4位操作码（1111保留），2个×4位=8位地址码，指令数2⁴-1=15条。
一地址指令：8位操作码（1111xxxx，xxxx≠1111），1个×4位=4位地址码，指令数15条。
零地址指令：12位操作码（1111xxxxxxxx），0位地址码，指令数16条。

### 例题5：寻址方式计算

**题目**：某计算机有16位地址线，8位数据线，采用直接寻址方式，求寻址范围。

**答案**：

16位地址线可以表示2¹⁶=65536个地址，即有65536个存储单元。8位数据线表示每个单元存8位数据（1字节），总容量65536×8位=64KB。

这就像一个仓库有65536个格子，每个格子能放8个鸡蛋，总容量就是64KB。

---

## ⚡ 知识点速记卡

> 考前快速过一遍，30秒回忆整章核心

**指令 = 操作码 + 地址码**。操作码指明做什么，地址码指明操作数在哪。

**地址码个数**：四地址（A1 OP A2 → A3，下条在A4）、三地址（→A3）、二地址（→A1）、一地址（ACC OP A1 → ACC）、零地址（栈操作）。

**扩展操作码**：地址数越少，操作码越长，指令种类越多。常用指令用短操作码，不常用指令用长操作码。

**七种寻址方式**：立即（数在指令里，最快）、直接（地址在指令里）、间接（地址指向的位置存着真正地址）、寄存器（数在寄存器，最快之一）、寄存器间接（寄存器里存地址）、基址（基址+偏移，适合重定位）、变址（变址+偏移，适合数组）、相对（PC+偏移，适合跳转）。

**RISC vs CISC**：RISC指令少、固定长度、单周期、流水线友好、硬布线控制（ARM/MIPS）；CISC指令多、可变长度、多周期、微程序控制（x86）。

**指令格式设计**：规整性（长度对齐）、高效性（常用指令短）、兼容性（向后兼容）、扩展性（留余地）。

---

## 🔗 相关链接

- [[00_计算机组成原理学习指南]] - 返回主目录
- [[06_运算方法]] - 上一章
- [[08_CPU结构与功能]] - 下一章
- [[09_控制单元功能]] - 控制单元相关内容

---

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