> ## Documentation Index
> Fetch the complete documentation index at: https://docs.0907world.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 第 5 章 指令系统

> 整理指令格式、操作码扩展、数据寻址方式，以及 CISC 与 RISC 的对比。

本章按“指令格式 → 寻址方式 → CISC 与 RISC → 考点与易错点”整理指令系统。复习时先建立指令的组成框架，再重点掌握扩展操作码计算和各种寻址方式的有效地址与访存次数。

> [!TIP]
>
> 计算题的两条主线：操作码用“位数划分”解决，寻址方式用“有效地址 EA + 访存次数”解决。遇到题目先写出指令格式，再逐项代入。

## 指令格式

### 基本概念

* **指令**：计算机执行某种操作的命令。
* **指令系统 / 指令集**：一台计算机所有指令的集合。
* **ISA（指令集体系结构）**：软件和硬件之间的接口，规定指令格式、寻址方式、寄存器、数据类型等。

### 指令基本格式

> 指令 = 操作码 OP + 地址码 A

* **操作码 OP**：指明做什么操作，如加、减、传送、转移。
* **地址码 A**：指明操作数或操作数地址。

### 操作码分类

> [accordion] 定长操作码
>
> * 操作码长度固定。
> * $n$ 位操作码最多表示 $2^{n}$ 条指令。
> * 优点：译码简单。
> * 缺点：扩展性差。

> [accordion] 变长操作码（扩展操作码）
>
> * 操作码长度可变。
>
> * 高频指令用短码，低频指令用长码。
>
> * 设计原则：
>   1. 短码不能是长码的前缀。
>   2. 每级必须留出扩展标志。
>   3. 地址码位数越多，操作码可用位数越少。
>
> * 常考：给出各级指令条数，求操作码位数或最多可扩展条数。
>
> > [!NOTE]
> >
> > 扩展操作码的本质是“二进制前缀不能被占用”。计算时先从短码逐级统计已用编码，再乘以每级剩余的扩展标志数。

### 地址码数量分类

| 类型 | 形式 | 特点 |
| - | - | - |
| 四地址 | OP A1 A2 A3 A4 | A4 常作下地址，现已少用 |
| 三地址 | OP A1 A2 A3 | A1 op A2 → A3 |
| 二地址 | OP A1 A2 | A1 op A2 → A1/A2 |
| 一地址 | OP A1 | 另一操作数隐含在累加器 AC |
| 零地址 | OP | 操作数隐含，如堆栈、停机、空操作 |

### 指令字长

* **单字长指令**：指令字长 = 机器字长。
* **半字长指令**：指令字长 = 半个机器字长。
* **双字长指令**：指令字长 = 两个机器字长。
* 指令字长通常取字节整数倍。

> [!WARNING]
>
> 易错：**指令字长 ≠ 机器字长 ≠ 存储字长**，三者无必然相等关系。

### 指令操作类型

* **数据传送**：MOV、LOAD、STORE。
* **算术逻辑**：ADD、SUB、AND、OR、NOT。
* **移位**：算术移位、逻辑移位、循环移位。
* **转移**：无条件转移、条件转移、调用、返回。
* **输入输出**：IN、OUT。
* **其他**：停机、空操作、中断等。

## 指令的寻址方式

### 指令寻址

* **顺序寻址**：PC 自动加一条指令长度。
* **跳跃寻址**：由转移指令修改 PC。

### 数据寻址

> 访存次数指“取操作数”阶段，不含取指令。

| 寻址方式 | 有效地址 / 操作数 | 访存次数 | 特点 |
| - | - | - | - |
| 隐含寻址 | 操作数隐含在 AC 或默认位置 | 0 | 指令短，灵活性差 |
| 立即寻址 | 操作数 = A | 0 | 快，范围受限 |
| 直接寻址 | EA = A | 1 | 简单，寻址范围受限 |
| 间接寻址 | EA = (A) | 2 | 范围大，慢 |
| 寄存器寻址 | 操作数 = R | 0 | 快，寄存器少 |
| 寄存器间接寻址 | EA = (R) | 1 | 操作数在内存 |
| 基址寻址 | EA = (BR) + A | 1 | 系统管理，程序重定位 |
| 变址寻址 | EA = (IX) + A | 1 | 用户管理，数组 / 循环 |
| 相对寻址 | EA = (PC) + A | 1 | 转移指令，程序浮动 |

### 各寻址方式详解

> [accordion] 隐含寻址
>
> * 操作数不在指令中显式给出，而是隐含在累加器 AC 或默认位置。
> * 访存次数：0。
> * 特点：指令短，但灵活性差。

> [accordion] 立即寻址
>
> * 指令中直接给出操作数本身。
> * 操作数 = A。
> * 访存次数：0。
> * 特点：速度快，但操作数范围受指令字长限制。

> [accordion] 直接寻址
>
> * 指令中给出操作数的内存地址。
> * EA = A。
> * 访存次数：1。
> * 特点：简单，但寻址范围受地址码位数限制。

> [accordion] 间接寻址
>
> * 指令中给出的地址指向一个内存单元，该单元中存放的是操作数的有效地址。
>
> * EA = (A)。
>
> * 访存次数：2。
>   * 第一次访存：取出有效地址 EA。
>   * 第二次访存：取出操作数。
>
> * 特点：寻址范围大，但速度慢。
>
> * 可多次间接寻址，但访存次数更多。
>
> > [!WARNING]
> >
> > 一次间接寻址取操作数需访存 **2 次**：先取有效地址，再取操作数。

> [accordion] 寄存器寻址
>
> * 操作数在寄存器中。
> * 操作数 = R。
> * 访存次数：0。
> * 特点：速度快，但寄存器数量有限。

> [accordion] 寄存器间接寻址
>
> * 寄存器中存放的是操作数的内存地址。
> * EA = (R)。
> * 访存次数：1。
> * 特点：操作数在内存，需访存一次。

> [accordion] 基址寻址
>
> * EA = (BR) + A，BR 为基址寄存器。
> * 访存次数：1。
> * 特点：
>   * 基址寄存器内容通常不变。
>   * 形式地址 A 可变。
>   * 面向系统，用于程序重定位。

> [accordion] 变址寻址
>
> * EA = (IX) + A，IX 为变址寄存器。
> * 访存次数：1。
> * 特点：
>   * 变址寄存器内容可变。
>   * 形式地址 A 通常不变。
>   * 面向用户，适合数组、循环访问。

> [accordion] 相对寻址
>
> * EA = (PC) + A。
> * A 通常为补码偏移量，可正可负。
> * PC 一般已指向下一条指令。
> * 访存次数：1。
> * 特点：用于转移指令，便于程序浮动。

### 易错对比

> [accordion] 基址寻址 vs 变址寻址
>
> | 比较项 | 基址寻址 | 变址寻址 |
> | - | - | - |
> | 有效地址 | EA = (BR) + A | EA = (IX) + A |
> | 寄存器内容 | 通常不变 | 通常可变 |
> | 形式地址 A | 可变 | 通常不变 |
> | 面向对象 | 系统 | 用户 |
> | 典型用途 | 程序重定位 | 数组、循环 |

> [accordion] 寄存器寻址 vs 寄存器间接寻址
>
> * **寄存器寻址**：操作数在寄存器中，访存次数 0。
> * **寄存器间接寻址**：寄存器中存放操作数地址，操作数在内存，访存次数 1。

> [accordion] 间接寻址
>
> * 一次间接寻址：访存 2 次。
> * 第一次取有效地址，第二次取操作数。

## CISC 与 RISC

| 比较项 | CISC | RISC |
| - | - | - |
| 指令数量 | 多、复杂 | 少、精简 |
| 指令长度 | 变长 | 定长 |
| 寻址方式 | 多 | 少 |
| 控制器 | 微程序控制为主 | 组合逻辑 / 硬布线控制为主 |
| 流水线 | 较难 | 适合 |
| 通用寄存器 | 较少 | 较多 |
| 访存方式 | 多数指令可访存 | 只有 load / store 访存 |
| CPI | 差异大，常大于 1 | 接近 1 |
| 编译优化 | 较难 | 较易 |
| 程序大小 | 较小 | 可能较大 |
| 典型代表 | x86 | MIPS、ARM 等 |

> [accordion] RISC 核心特征
>
> * 指令少且精简。
> * 指令长度固定。
> * 寻址方式少。
> * Load / Store 架构：只有取数和存数指令访问内存。
> * 通用寄存器多。
> * 硬布线控制为主。
> * 适合流水线。
> * 一个周期执行一条指令，CPI 接近 1。
> * 编译优化容易。

> [accordion] CISC 核心特征
>
> * 指令多且复杂。
> * 指令长度可变。
> * 寻址方式多。
> * 微程序控制为主。
> * 通用寄存器较少。
> * 多数指令可直接访存。
> * 指令执行周期差异大。
> * 编译优化较难。

> [!NOTE]
>
> 注意：现代 CISC 和 RISC 界限逐渐模糊，CISC 处理器内部也常采用 RISC 思想。

## 本章高频考点与易错点

### 高频考点

1. 扩展操作码编码计算。
2. 各种寻址方式的有效地址计算。
3. 各种寻址方式的访存次数。
4. 基址、变址、相对寻址的区别。
5. 一地址、零地址指令的隐含操作数。
6. 指令字长、机器字长、存储字长的关系。
7. CISC 与 RISC 的对比判断。

### 易错点

1. **间接寻址访存次数**：一次间接寻址取操作数需访存 2 次。
2. **相对寻址 PC 值**：通常 PC 已指向下一条指令。
3. **基址与变址**：基址面向系统，变址面向用户。
4. **寄存器寻址与寄存器间接寻址**：前者操作数在寄存器，后者操作数在内存。
5. **指令字长与机器字长**：二者无必然相等关系。
6. **扩展操作码**：短码不能是长码前缀，每级要留扩展标志。
7. **CISC / RISC**：RISC 只有 load / store 访存，指令定长，适合流水线。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.