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

8.0 KiB
Raw Permalink Blame History

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} 条

关联笔记