Appearance
指令设计(操作码扩展)
考情分析
扩展操作码计算题是 408 大题中的常见考点,通常给出指令字长和地址码位数,要求计算各格式下能表示的最多指令条数。需要掌握"前缀保留"原则和计算方法。
大纲定位
考纲第四章(二):指令格式(扩展操作码的设计)。
要求到什么程度:给定各类指令的条数需求,能设计操作码的分配方案并算出指令字长;也能反过来由字长和已用条数,推某一级最多还能放几条。
固定长度操作码的局限
定长操作码的问题:所有指令的操作码位数固定,地址码位数也固定,难以同时支持地址多的指令(少位操作码)和地址少的指令(多位操作码)。
扩展操作码:让地址码少的指令"借用"多余的位来扩展操作码,实现不同指令用不同长度的操作码。
好处:在相同指令字长下,能够表示更多种类的指令。
设计原则
短操作码不能是长操作码的前缀
若某操作码为
1100(4位),则不能同时存在以1100开头的 8 位操作码(如11001010),否则译码器无法判断指令边界。各操作码不重复、不遗漏
每一种编码只属于一条指令。
使用频率高的指令用短操作码
短操作码 + 多地址位,支持更多寻址能力;长操作码 + 少地址位,用于不需要地址的特殊操作。
典型扩展操作码结构
设指令字长 16 位,地址字段每个 4 位。
格式一(三地址):[4位OP | 4位A1 | 4位A2 | 4位A3]
格式二(二地址):[8位OP | 4位A1 | 4位A2 ]
格式三(一地址):[12位OP| 4位A1 ]
格式零(零地址):[16位OP ]若格式一的操作码不包含 1111(保留用于扩展),则格式一最多表示
格式二的操作码以 1111 开头(4位),再用 4 位扩展:最多 11111111 用于格式三)。
以此类推。
标准计算模型
设指令字长
- 三地址:操作码
位,三个 位地址 - 二地址:操作码
位,两个 位地址 - 一地址:操作码
位,一个 位地址
条件:
因此:
前缀保留:三地址格式中预留若干编码不用,留给二地址格式做前缀。设三地址格式有
统一符号:容量上限 vs 实际可用
这里必须分清两个量,否则跨级递推一定算错:
| 量 | 定义 |
|---|---|
| 容量上限 | 第 |
| 已用 | 该级实际要放的指令条数(题目给的需求) |
| 剩余前缀 |
递推关系:
第一级的
编者注(易错):很多资料只写"每级保留 1 个
1111做前缀",那是题目恰好这么设计的特例,不是规则。真题常给"某级已用 254 条",这时剩余前缀容量上限 254,得先把容量上限算出来。
经典例题
题1:16位指令,4位地址字段,三段扩展
指令字长 16 位,地址字段每段 4 位。
三地址格式:OP = 4 位,地址 = 4+4+4 = 12 位
操作码
0000~1110(保留1111)= 15 条三地址指令二地址格式:OP = 8 位,地址 = 4+4 = 8 位
前4位固定为
1111,后4位:0000~1110(保留1111)= 15 条二地址指令一地址格式:OP = 12 位,地址 = 4 位
前8位固定为
1111 1111,后4位:0000~1110(保留1111)= 15 条一地址指令零地址格式:OP = 16 位
前12位固定为
1111 1111 1111,后4位:0000~1111= 16 条零地址指令
总计:
题2:给定已有指令数,求另一格式最多多少条
题:指令字长 12 位,操作数地址字段 3 位。已知有 8 条三地址指令,求最多能有多少条二地址指令?
三地址格式:操作码
已有 8 条,全部用完,没有剩余操作码可供二地址格式使用。
答:0 条(三地址已将 3 位操作码用尽,无法扩展)。
换:已知有 4 条三地址指令,求最多多少条二地址指令?
三地址使用 4 个编码(000~011),保留 100~111 共 4 个前缀给二地址扩展。
二地址格式:OP = 3+3 = 6 位,前 3 位是 4 种保留前缀之一,后 3 位自由。
最多 =
题3:逆向推导(给定各格式指令数,验证是否可行)
题:16 位指令字,地址字段 4 位。需要 15 条三地址、15 条二地址、15 条一地址和 16 条零地址指令,能否设计?
按题1的方案,正好是 15+15+15+16 = 61 条,可行。
扩展操作码的一般公式
设操作码从
这一级实际用掉
反向题:给需求求最小操作码位数
真题也常反着问——"各类指令各要多少条,问指令字长最少多少位"。这时要解不等式:
设短格式操作码
解出
例:短格式操作码
取
编者注(收尾):求出操作码位数后还没完——加上地址字段得到指令字长,再按编址单位向上圆整。按字节编址时算出 23 位要圆整到 24 位。漏掉这一步是这类题的经典失分点。
一条容易忽略的设计约束
"短操作码不能是长操作码的前缀"针对的是同一个字段位置。若两个操作码分处不同字段(如某些定长多型指令,OP 在
判断"某两个操作码能否相同",先看它们是不是占同一段位:同段必须互异,不同段可以复用。
本文模型的适用边界
上面「标准计算模型」预设的是每种格式只有操作码 + 若干等宽地址字段、逐级回收一个地址字段这种规整结构。真题里的格式往往是多字段不等宽的(Ms/Rs/Md/Rd、rs/rt/imm、funct7/rs2/rs1/funct3/rd/opcode),套不进这个模型——那类题要照题面的字段表逐段填值,不要硬套公式。
解题动作清单:一张五列表走到底
不管题目怎么问,先把这张表列出来,答案都在里面:
| 格式 | OP 位数 | 容量上限 | 已用 | 剩余前缀 |
|---|
填法:
完整走查:指令字长 16 位,每个地址码 6 位。二地址指令 12 条、一地址指令 254 条,问零地址指令最多几条?
| 格式 | OP 位数 | 容量上限 | 已用 | 剩余前缀 |
|---|---|---|---|---|
| 二地址 | 12 | |||
| 一地址 | 254 | |||
| 零地址 | — | — |
答:零地址指令最多 128 条。
编者注(易错):中间那个 256 是最容易漏的量。只记住"每级留一个前缀"的人会直接拿 1 去乘,得 64——差一倍。容量上限必须显式算出来再减已用。
收尾两条检查:
- 需求
容量上限?任何一级超了,这个方案就不可行,要回头加操作码位数 - 指令字长是不是编址单位的整数倍?不是就向上圆整
考点清单
- 短操作码不能是长操作码的前缀(唯一可译码原则——否则译码器无法判断指令边界)
- 容量上限
,剩余前缀 ,逐级递推;别默认"每级只留 1 个前缀" - 反向求最小操作码位数:解
,除完向上取整 - 算完字长要按编址单位向上圆整(23 位按字节编址 → 24 位)
- 同一字段位置的操作码必须互异,分处不同字段的可以复用同一编码
- 扩展操作码:保留若干短操作码作为"扩展标记",用更多位给下一格式
- 三地址保留
个 → 二地址能用 个编码( 为扩展位数) - 若上一格式已用满所有编码,则无法继续扩展
- 计算题思路:从最短操作码格式开始,逐级计算保留数量和可用数量