Appearance
题目
设计某指令系统时,假设采用 16 位定长指令字格式,操作码使用扩展编码方式,地址码为 6 位,包含零地址、一地址和二地址 3 种格式的指令。若二地址指令有 12 条,一地址指令有 254 条,则零地址指令的条数最多为( )。
错因
A
误以为"一地址 254 条几乎用完所有空间,零地址不可能再有"。其实从一地址扩展到零地址时,地址码 6 位会被释放出来作为额外的操作码字段,使每个剩余的一地址前缀能再分裂成 个零地址指令。即使只剩 1 个一地址前缀未用,零地址也能扩出 64 条。
B
只数到了"未用的 10 位前缀有 2 个",忘了再乘 。从一地址(10 位 OP)扩展到零地址(16 位 OP)多出 6 位地址码空间,每个未用前缀可繁殖出 条零地址指令。。只写 2 等于止步在前缀计数。
C
只算了 1 个未用前缀的扩展()。题目算下来一地址最多 256 条(),已用 254 条 → 剩 2 个 10 位前缀,不是 1 个。 才对。
总解析
第一步:分层算"每级操作码可用空间"
定长指令字 16 位 = OP + 地址码。每多一段地址码占 6 位:
| 指令格式 | 地址码占用 | OP 位数 | OP 总编码数 |
|---|---|---|---|
| 二地址 | 12(两个 6 位) | 16 − 12 = 4 | |
| 一地址 | 6 | 16 − 6 = 10 | |
| 零地址 | 0 | 16 |
第二步:扩展编码的核心规则
短 OP 中未使用的编码才能作为更长 OP 的"前缀"。每多 6 位地址码空间释放,可乘 倍。
第三步:从二地址 → 一地址
- 二地址 OP 4 位,共 16 个编码
- 已用 12 条二地址 → 剩 个 4 位前缀可扩展
- 每个 4 位前缀 + 6 位次操作码 = 10 位 OP
- 一地址最多 = 条
- 题目说一地址 254 条 → 剩 个 10 位前缀未用
第四步:从一地址 → 零地址
- 每个未用 10 位前缀 + 6 位末操作码 = 16 位 OP
- 零地址最多 = 条
汇总(一图看完):
| 步骤 | 计算 | 结果 |
|---|---|---|
| 二地址未用前缀 | 4 个(4 位) | |
| 一地址容量上限 | 256 | |
| 一地址未用前缀 | 2 个(10 位) | |
| 零地址容量上限 | 128 |
最终答案是 D(128)。
操作码扩展编码 通用模板:
设当前格式 OP 位数为 ,已用 条;下一级地址码减少 位(即 OP 加长 位):
易错点:
- 每多 6 位地址码空间,乘 ——本题主线是"翻倍 64 → 翻倍 64"
- 未用前缀数 = 上级总编码 − 已用条数(不是地址码差)
- 提到"最多"暗示题目假设把所有能扩展的都用尽——不要保留余量