Files

231 lines
8.0 KiB
Markdown
Raw Permalink Normal View History

2026-06-16 21:34:37 +08:00
---
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性能参数计算]]