首页/计算机组成原理/04-instruction/指令操作码设计 🔗 在 Obsidian 中打开
计算机组成原理 · 04-instruction

指令操作码设计

重要度 ⭐⭐⭐⭐指令系统操作码编码定长变长
速查
操作码指定操作类型定长规整易译码但条数受限,变长灵活但译码复杂,扩展操作码是二者折中——短码给常用(多地址)指令,长码给不常用(少地址)指令,$n$ 位操作码最多表示 $2^{n}$ 条指令。

速查

项目
定长操作码所有指令操作码等长,规整但浪费
变长操作码不同指令操作码长度不同,灵活但复杂
扩展操作码定长 + 变长的折中,408 重点考
n 位操作码最多表示 $2^{n}$ 条指令
RISC定长操作码
CISC变长操作码

核心概念

操作码(Opcode)是指令中用于指定操作类型的部分。

定长操作码

  • 所有指令的操作码长度相同(如 8 位)
  • $n$ 位操作码最多表示 $2^{n}$ 条不同指令
  • 优点:译码简单、规整
  • 缺点:指令条数受限,当指令多时操作码位数浪费
  • 典型:RISC 架构(如 MIPS、ARM)
同一指令字长下的两种编码策略 定长 OP(4) A1 A2 A3 扩展 1111 OP(4) A1 A2 橙 = 操作码;浅棕 = 地址码;淡橙 = 扩展标志前缀
图:操作码位数与地址码位数在固定指令字长内此消彼长

变长操作码(扩展操作码)

  • 不同指令的操作码长度不同
  • 扩展操作码是 408 考试的重点:将指令字长固定,通过操作码和地址码的位数此消彼长来设计

扩展操作码设计方法

核心思想:短操作码留给常用指令(地址码多 → 操作数多),长操作码留给不常用指令(地址码少 → 操作数少)。

设计步骤(以 16 位指令字长、4 位为一个字段为例):

  1. 4 位操作码(0000~1110)→ 15 条三地址指令,留 1111 作扩展标志
  2. 8 位操作码(1111 0000~1111 1110)→ 15 条二地址指令
  3. 12 位操作码(1111 1111 0000~1111 1111 1110)→ 15 条一地址指令
  4. 16 位操作码(1111 1111 1111 0000~1111 1111 1111 1111)→ 16 条零地址指令

扩展操作码计算公式

若 $k$ 位操作码、每个地址码 $a$ 位、指令字长 $L$ 位:

  • 三地址指令最多:$2^{k} - x_1$ 条($x_1$ 为扩展标志数)
  • 二地址指令最多:$x_1 \times 2^{a} - x_2$ 条
  • 以此类推……

关键性质

编码方式优点缺点
定长操作码译码简单,规整指令条数受限
变长操作码灵活,充分利用位数译码复杂
扩展操作码折中方案设计复杂

扩展操作码的约束

  1. 短操作码的编码不能与长操作码的前缀相同
  2. 至少保留一个编码作为扩展标志
  3. 操作码越短 → 地址码越多 → 操作数越多

常见考法

考法解题套路
求最多可设计多少条指令根据操作码位数计算 $2^{n}$
扩展操作码设计短码留扩展标志,长码用前缀区分
计算各类指令的数量逐层计算:总编码 − 已用编码
判断编码是否合法检查是否有前缀冲突
操作码位数与指令数关系$n$ 位 → 最多 $2^{n}$ 条

计算示例

指令字长 16 位,基本操作码 4 位,地址码 4 位
  • 三地址指令:操作码 0000~1110,共 15 条(1111 扩展)
  • 二地址指令:1111 + 4 位,0000~1110,共 15
  • 一地址指令:1111 1111 + 4 位,0000~1110,共 15
  • 零地址指令:1111 1111 1111 + 4 位,0000~1111,共 16

易错点

⚠️ 必记
  • 扩展操作码中必须保留至少一个编码作为扩展标志。
  • 短操作码不能是长操作码的前缀(否则译码歧义)。
  • 三地址指令条数 $= 2^{k} - $ 扩展标志数,不是 $2^{k}$。
  • 零地址指令不需要扩展标志(已是最后层)。
  • 操作码越短 → 指令功能越简单(地址码多 → 操作数多)。

核心结论

必背
  1. 定长操作码译码简单但灵活性差,变长操作码灵活但译码复杂。
  2. 扩展操作码是 408 重点:短码留给常用指令,长码留给不常用指令。
  3. $n$ 位操作码最多表示 $2^{n}$ 条指令。
  4. 扩展标志是关键约束:短码必须留出至少一个编码。
  5. 操作码位数和地址码位数此消彼长

记忆卡片

n 位操作码最多表示多少条指令?
$2^{n}$ 条。
扩展操作码的核心思想?
短码给常用指令(多地址),长码给不常用指令(少地址)。
短操作码的约束?
不能是长操作码的前缀,至少留一个作扩展标志。
RISC 用什么操作码编码?
定长操作码。
扩展标志的作用?
区分当前编码是否需要继续读取更多位来译码。
操作码与地址码的关系?
固定字长下此消彼长:OP 变长则地址码变短。

交互动画 · 扩展操作码逐层展开

16 位指令字长 · 每段 4 bit OPbit 15–12 A1bit 11–8 A2bit 7–4 A3bit 3–0 操作码 4 位 扩展规则:本层用尽 1111 作标志,把编码空间让给下一层 淡橙 = 扩展标志前缀 · 橙 = 本层操作码 · 浅棕 = 地址码
点击上方按钮,观察操作码如何"吃掉"地址码字段
当前层:—
示意图:固定 16 位指令字,操作码每扩展 4 位就吞并一个地址码字段,可编码指令数按 15 / 15 / 15 / 16 逐层分配。

相关知识点

instruction-format instruction-length-and-opcode cisc-and-risc

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。