8.0 KiB
tags, create time
| 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}条