--- 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性能参数计算]]