Files
final-exam/计算机系统结构/重点复习/大题2-指令操作编码方式.md
T

231 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- 计算机系统结构
- 重点复习
- 指令系统
- 操作码编码
create time: 2026-06-16 21:21
---
# 大题 2 — 指令操作编码方式
## 概述
本题考查**指令操作码的编码方式**,包括**定长操作码**和**扩展操作码**(等长扩展码)两种方案的设计与计算。这是指令系统设计的核心内容,是历年分析题的高频考点(A 卷、B 卷均有出现)。
> [!tip] 考试重点
> 掌握扩展操作码的**逐层展开**计算方法:从地址数最多的指令开始,每层计算可用编码空间,减去已用指令条数,剩余的作为扩展标志向下一层扩展。
## 正文
### 一、指令格式基础
一条指令由**操作码**(Opcode)和**地址码**(Address Field)组成:
```
┌─────────────┬──────────┬──────────┬──────────┐
│ 操作码 │ 地址码1 │ 地址码2 │ 地址码3 │
└─────────────┴──────────┴──────────┴──────────┘
```
**约束条件**:指令字长固定,操作码位数 + 各地址码位数之和 = 指令字长
> [!question] 为什么要使用扩展操作码?
> 定长操作码对所有指令使用相同位数,但不同类型的指令需要的操作码空间不同。例如三地址指令只需要几条(操作码短),零地址指令可能需要很多条(操作码长)。扩展操作码允许不同类型的指令使用不同长度的操作码,在固定指令字长下支持**更多指令**。
### 二、定长操作码
所有指令的操作码位数**固定相同**。
**操作码位数计算**:
$$\text{操作码位数} = \text{指令字长} - \text{地址码总位数}$$
**最大指令条数**:
$$\text{最大指令条数} = 2^{\text{操作码位数}}$$
> [!example] 定长操作码示例
>
> **已知**:指令字长 16 位,每个地址字段 6 位,设计双地址指令和单地址指令。
>
> **双地址指令**:操作码 = $16 - 6 \times 2 = 4$ 位,最多 $2^4 = 16$ 条。
>
> 如果需要 12 条双地址指令,剩余 $16 - 12 = 4$ 条留给单地址指令。
>
> **单地址指令**:操作码仍为 4 位(定长),最多 **4 条**。
>
> **问题**:单地址指令只能有 4 条——太少了!这就是定长操作码的局限。
### 三、扩展操作码(等长扩展码)
**核心思想**:操作码位数不固定,通过**保留编码**作为扩展标志,将地址码字段"借用"为操作码的一部分。
#### 3.1 设计原则
| 原则 | 说明 |
|------|------|
| 短操作码给高频指令 | 使用频率高的指令分配短操作码,减少平均指令长度 |
| 扩展标志不冲突 | 短操作码的某些编码被保留作为"扩展标志",告诉译码器继续读取后续字段作为操作码 |
| 前缀不二义 | 短操作码不能是长操作码的前缀(否则译码歧义) |
#### 3.2 计算方法
> [!note] 逐层扩展的通用算法
>
> 设指令字长为 $W$ 位,每个地址字段为 $A$ 位。
>
> **第 1 层(三地址指令)**:
> - 操作码位数 = $W - 3A$
> - 最大编码空间 = $2^{W-3A}$
> - 设需要 $k_1$ 条三地址指令,则保留 $2^{W-3A} - k_1$ 个扩展标志
>
> **第 2 层(二地址指令)**:
> - 每个扩展标志可扩展 $A$ 位 → 新增 $A$ 位操作码
> - 可用编码空间 = $(2^{W-3A} - k_1) \times 2^A$
> - 设需要 $k_2$ 条二地址指令,保留 $(2^{W-3A} - k_1) \times 2^A - k_2$ 个扩展标志
>
> **第 3 层(单地址指令)**:
> - 可用编码空间 = 上一层保留数 $\times 2^A$
> - 设需要 $k_3$ 条,保留继续扩展
>
> **第 4 层(零地址指令)**:
> - 操作码占满整个指令字长 $W$ 位
> - 可用编码空间 = 上一层保留数 $\times 2^A$
### 四、典型例题(参考习题 2.13)
> [!example] 例题 1:扩展操作码设计(A 卷原题风格)
>
> **题目**:指令字长 12 位,每个地址字段 3 位。设计扩展操作码使系统支持:
> - 4 条三地址指令
> - 8 条二地址指令
> - 190 条单地址指令
>
> 求各类指令的编码方案。
>
> **解题步骤**:
>
> **Step 1:三地址指令**
>
> 操作码位数 = $12 - 3 \times 3 = 3$ 位
>
> 编码空间 = $2^3 = 8$,需要 4 条 → 使用编码 `000` ~ `011`
>
> 保留扩展标志 = $8 - 4 = 4$ 个(编码 `100` ~ `111`)
>
> **Step 2:二地址指令**
>
> 操作码位数 = $3 + 3 = 6$ 位(前 3 位 + 借用地址字段 1 的 3 位)
>
> 可用编码空间 = $4 \times 2^3 = 32$,需要 8 条 → 使用 8 个编码
>
> 保留扩展标志 = $32 - 8 = 24$ 个
>
> **Step 3:单地址指令**
>
> 操作码位数 = $6 + 3 = 9$ 位(再借用地址字段 2 的 3 位)
>
> 可用编码空间 = $24 \times 2^3 = 192$
>
> 需要 190 条 → 使用 190 个编码,保留 $192 - 190 = 2$ 个扩展标志
>
> **Step 4:结果汇总**
>
> | 类型 | 操作码位数 | 地址字段位数 | 指令条数 |
> |:----:|:---------:|:----------:|:-------:|
> | 三地址 | 3 位 | $3 \times 3 = 9$ 位 | 4 条 |
> | 二地址 | 6 位 | $2 \times 3 = 6$ 位 | 8 条 |
> | 单地址 | 9 位 | $1 \times 3 = 3$ 位 | 190 条 |
>
> **验证**:$4 + 8 + 190 = 202$ 条指令。
> [!example] 例题 2:求零地址指令最大数量(B 卷原题风格)
>
> **题目**:指令字长 16 位,每个地址字段 4 位。设计扩展操作码使得:
> - 15 条三地址指令
> - 15 条二地址指令
> - 15 条单地址指令
> - 零地址指令**尽可能多**
>
> **解题步骤**:
>
> **Step 1:三地址指令**
>
> 操作码位数 = $16 - 3 \times 4 = 4$ 位
>
> 编码空间 = $2^4 = 16$,用 15 条 → 保留 **1** 个扩展标志
>
> **Step 2:二地址指令**
>
> 可用编码 = $1 \times 2^4 = 16$,用 15 条 → 保留 **1** 个扩展标志
>
> **Step 3:单地址指令**
>
> 可用编码 = $1 \times 2^4 = 16$,用 15 条 → 保留 **1** 个扩展标志
>
> **Step 4:零地址指令**
>
> 可用编码 = $1 \times 2^4 = \mathbf{16}$ 条
>
> **结果汇总**:
>
> | 类型 | 操作码位数 | 指令条数 |
> |:----:|:---------:|:-------:|
> | 三地址 | 4 位 | 15 |
> | 二地址 | 8 位 | 15 |
> | 单地址 | 12 位 | 15 |
> | 零地址 | 16 位 | **16** |
>
> 共计 $15 + 15 + 15 + 16 = 61$ 条指令。
### 五、定长 vs 扩展操作码对比
| 对比维度 | 定长操作码 | 扩展操作码 |
|----------|:----------:|:----------:|
| 译码复杂度 | 简单 | 较复杂 |
| 指令空间利用 | 低(浪费位数) | 高(按需分配) |
| 支持指令数量 | 少(受限于固定位数) | 多(灵活扩展) |
| 平均指令长度 | 固定 | 可变(高频指令更短) |
| 适用场景 | RISC(指令数量少、格式规整) | CISC(指令数量多、类型多样) |
### 六、练习题
> [!example] 练习 1(B 卷原题)
>
> 指令字长 16 位,地址字段 6 位。设计 12 条双地址指令,求:
> (1) 定长操作码下最多可设计多少条单地址指令?
> (2) 等长扩展码下最多可设计多少条单地址指令?
>
> > [!abstract]- 答案
> > (1) 定长:操作码 4 位 → $2^4 - 12 = \mathbf{4}$ 条单地址指令
> >
> > (2) 扩展码:保留 4 个扩展标志 × $2^6 = 256$ → 最多 **256** 条单地址指令
> >
> > 扩展码的优势一目了然:从 4 条提升到 256 条!
> [!example] 练习 2
>
> 指令字长 16 位,地址字段 4 位。要求设计:
> - 12 条三地址指令
> - 62 条二地址指令
> - 30 条单地址指令
> - 零地址指令尽可能多
>
> 求各类指令条数和总指令条数。
>
> > [!abstract]- 答案
> > 三地址:操作码 4 位,$2^4=16$,用 12 条,保留 4 个
> >
> > 二地址:$4 \times 2^4 = 64$,用 62 条,保留 2 个
> >
> > 单地址:$2 \times 2^4 = 32$,用 30 条,保留 2 个
> >
> > 零地址:$2 \times 2^4 = \mathbf{32}$ 条
> >
> > 总计:$12 + 62 + 30 + 32 = \mathbf{136}$ 条
## 关联笔记
- [[计算机系统结构/复习文档/指令系统设计]]
- [[大题1-CPU性能参数计算]]