精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

指令设计(操作码扩展)

考情分析

扩展操作码计算题是 408 大题中的常见考点,通常给出指令字长和地址码位数,要求计算各格式下能表示的最多指令条数。需要掌握"前缀保留"原则和计算方法。

大纲定位

考纲第四章(二):指令格式(扩展操作码的设计)。

要求到什么程度:给定各类指令的条数需求,能设计操作码的分配方案并算出指令字长;也能反过来由字长和已用条数,推某一级最多还能放几条。

固定长度操作码的局限

定长操作码的问题:所有指令的操作码位数固定,地址码位数也固定,难以同时支持地址多的指令(少位操作码)和地址少的指令(多位操作码)。

扩展操作码:让地址码少的指令"借用"多余的位来扩展操作码,实现不同指令用不同长度的操作码。

好处:在相同指令字长下,能够表示更多种类的指令。

设计原则

  1. 短操作码不能是长操作码的前缀

    若某操作码为 1100(4位),则不能同时存在以 1100 开头的 8 位操作码(如 11001010),否则译码器无法判断指令边界。

  2. 各操作码不重复、不遗漏

    每一种编码只属于一条指令。

  3. 使用频率高的指令用短操作码

    短操作码 + 多地址位,支持更多寻址能力;长操作码 + 少地址位,用于不需要地址的特殊操作。

典型扩展操作码结构

设指令字长 16 位,地址字段每个 4 位。

格式一(三地址):[4位OP | 4位A1 | 4位A2 | 4位A3]
格式二(二地址):[8位OP | 4位A1 | 4位A2    ]
格式三(一地址):[12位OP| 4位A1              ]
格式零(零地址):[16位OP                      ]

若格式一的操作码不包含 1111(保留用于扩展),则格式一最多表示 241=15 条三地址指令。

格式二的操作码以 1111 开头(4位),再用 4 位扩展:最多 241=15 条(再保留 11111111 用于格式三)。

以此类推。

标准计算模型

设指令字长 n 位,定义三种格式:

  • 三地址:操作码 k1 位,三个 m 位地址
  • 二地址:操作码 k2 位,两个 m 位地址
  • 一地址:操作码 k3 位,一个 m 位地址

条件:k1+3m=k2+2m=k3+m=n

因此:k2=k1+mk3=k1+2m

前缀保留:三地址格式中预留若干编码不用,留给二地址格式做前缀。设三地址格式有 p 个操作码保留,则二地址格式的操作码以这 p 种前缀之一开头。

统一符号:容量上限 vs 实际可用

这里必须分清两个量,否则跨级递推一定算错:

定义
容量上限 Cii理论上最多能编多少条 =pi1×2Δi,其中 pi1 是上一级剩下的前缀数、Δi 是本级比上级多出的操作码位数
已用 ui该级实际要放的指令条数(题目给的需求)
剩余前缀 pi=Ciui,留给下一级用

递推关系:

Ci=pi1×2Δi,pi=Ciui

第一级的 p0=2k1(整个短操作码空间)。"剩余前缀"就是下一级的种子,这条链是所有扩展操作码题的骨架。

编者注(易错):很多资料只写"每级保留 1 个 1111 做前缀",那是题目恰好这么设计的特例,不是规则。真题常给"某级已用 254 条",这时剩余前缀 = 容量上限 254,得先把容量上限算出来。

经典例题

题1:16位指令,4位地址字段,三段扩展

指令字长 16 位,地址字段每段 4 位。

  • 三地址格式:OP = 4 位,地址 = 4+4+4 = 12 位

    操作码 00001110(保留 1111)= 15 条三地址指令

  • 二地址格式:OP = 8 位,地址 = 4+4 = 8 位

    前4位固定为 1111,后4位:00001110(保留 1111)= 15 条二地址指令

  • 一地址格式:OP = 12 位,地址 = 4 位

    前8位固定为 1111 1111,后4位:00001110(保留 1111)= 15 条一地址指令

  • 零地址格式:OP = 16 位

    前12位固定为 1111 1111 1111,后4位:00001111 = 16 条零地址指令

总计:15+15+15+16=61 条指令。

题2:给定已有指令数,求另一格式最多多少条

:指令字长 12 位,操作数地址字段 3 位。已知有 8 条三地址指令,求最多能有多少条二地址指令?

三地址格式:操作码 123×3=3 位,三地址指令最多 23=8 条。

已有 8 条,全部用完,没有剩余操作码可供二地址格式使用。

答:0 条(三地址已将 3 位操作码用尽,无法扩展)。

:已知有 4 条三地址指令,求最多多少条二地址指令?

三地址使用 4 个编码(000~011),保留 100~111 共 4 个前缀给二地址扩展。

二地址格式:OP = 3+3 = 6 位,前 3 位是 4 种保留前缀之一,后 3 位自由。

最多 = 4×23=32 条二地址指令(若不继续向下扩展)。

题3:逆向推导(给定各格式指令数,验证是否可行)

:16 位指令字,地址字段 4 位。需要 15 条三地址、15 条二地址、15 条一地址和 16 条零地址指令,能否设计?

按题1的方案,正好是 15+15+15+16 = 61 条,可行。

扩展操作码的一般公式

设操作码从 k1 位扩展到 k2 位(k2>k1),上一级剩余前缀数p,则下一级的容量上限为:

C=p2k2k1

这一级实际用掉 u 条后,再往下传的剩余前缀是 p=Cu一路递推到最后一级即可。

反向题:给需求求最小操作码位数

真题也常反着问——"各类指令各要多少条,问指令字长最少多少位"。这时要解不等式

设短格式操作码 a 位、已用 u 条,长格式比它多 Δ 位、需要 v 条,则要求

(2au)×2Δv

解出 a 的最小值。注意除完要向上取整

2auv2Δ

:短格式操作码 a 位,已用 29 条;长格式操作码多 6 位,需要 107 条。

2a2910764=22a31a5

a=5

编者注(收尾):求出操作码位数后还没完——加上地址字段得到指令字长,再按编址单位向上圆整。按字节编址时算出 23 位要圆整到 24 位。漏掉这一步是这类题的经典失分点。

一条容易忽略的设计约束

"短操作码不能是长操作码的前缀"针对的是同一个字段位置。若两个操作码分处不同字段(如某些定长多型指令,OP 在 [15:12]、功能码在 [5:0]),它们可以取相同编码——由另一个字段消歧,不产生译码歧义。

判断"某两个操作码能否相同",先看它们是不是占同一段位:同段必须互异,不同段可以复用。

本文模型的适用边界

上面「标准计算模型」预设的是每种格式只有操作码 + 若干等宽地址字段、逐级回收一个地址字段这种规整结构。真题里的格式往往是多字段不等宽的(Ms/Rs/Md/Rdrs/rt/immfunct7/rs2/rs1/funct3/rd/opcode),套不进这个模型——那类题要照题面的字段表逐段填值,不要硬套公式。

解题动作清单:一张五列表走到底

不管题目怎么问,先把这张表列出来,答案都在里面:

格式OP 位数容量上限 C已用 u剩余前缀 p

填法:Ci=pi1×2Δipi=Ciui,逐行往下推。

完整走查:指令字长 16 位,每个地址码 6 位。二地址指令 12 条、一地址指令 254 条,问零地址指令最多几条?

格式OP 位数容量上限 C已用 u剩余前缀 p
二地址1666=424=16121612=4
一地址166=10Δ=64×26=256254256254=2
零地址16Δ=62×26=128

答:零地址指令最多 128 条。

编者注(易错):中间那个 256 是最容易漏的量。只记住"每级留一个前缀"的人会直接拿 1 去乘,得 64——差一倍。容量上限必须显式算出来再减已用。

收尾两条检查:

  1. 需求 容量上限?任何一级超了,这个方案就不可行,要回头加操作码位数
  2. 指令字长是不是编址单位的整数倍?不是就向上圆整

考点清单

  • 短操作码不能是长操作码的前缀(唯一可译码原则——否则译码器无法判断指令边界)
  • 容量上限 C=p×2Δ,剩余前缀 p=Cu,逐级递推;别默认"每级只留 1 个前缀"
  • 反向求最小操作码位数:解 (2au)×2Δv,除完向上取整
  • 算完字长要按编址单位向上圆整(23 位按字节编址 → 24 位)
  • 同一字段位置的操作码必须互异,分处不同字段的可以复用同一编码
  • 扩展操作码:保留若干短操作码作为"扩展标记",用更多位给下一格式
  • 三地址保留 p 个 → 二地址能用 p×2m 个编码(m 为扩展位数)
  • 若上一格式已用满所有编码,则无法继续扩展
  • 计算题思路:从最短操作码格式开始,逐级计算保留数量和可用数量

真题练习