Appearance
题目
某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令 29 条,二地址指令 107 条,每个地址字段为 6 位,则指令字长至少应该是( )。
错因
B
把"按字节编址 → 指令字长应是 8 的倍数"这一步漏掉。例如算出 a=5 位三地址操作码、b=11 位二地址操作码 → 指令字长 = 5 + 18 = 23 位(恰好够);或者算出"22 位/24 位"边界后,加几位补到 26。两种都没补到 8 的倍数。
C
操作码位数选得"过宽"——比如三地址操作码用 7 位、二地址用 9 位,导致字长 = 7 + 18 = 25 → 圆整到 28。本题 29 条三地址指令只需 5 位最小(),不必预留 7 位。常见原因是没掌握"扩展操作码"思想,按"每种指令独立编码"硬算。
D
直接套了"现代计算机字长一般 32 位"的常识,没真去推导。题面问的是"至少",应当按最紧凑设计算,不是按惯用值。
总解析
第一步:建立模型
设三地址操作码 位、二地址操作码 位(,因为二地址指令多需要更长操作码扩展)。
| 格式 | 操作码 | 地址字段 | 总字长 |
|---|---|---|---|
| 三地址 | 位 | 位 | |
| 二地址 | 位 | 位 |
指令字长固定 → → 。
第二步:扩展操作码可编码数量约束
- 三地址: 种编码,使用了 29 种 → 剩下 种作为"扩展前缀"
- 二地址:用三地址留下的前缀的"扩展空间"
二地址可编码总数
要求:
第三步:取 算最小字长
第四步:考虑"按字节编址"约束
按字节编址时,指令字长必须是 8 的倍数——否则一条指令跨越字节会导致取指错位、地址计算复杂。
将 23 位向上圆整到 8 的倍数:
| 候选字长 | 是否 ≥ 23 | 是否 8 的倍数 |
|---|---|---|
| 16 | ✗ | ✓ |
| 24 | ✓ | ✓ |
| 32 | ✓ | ✓ |
最小满足两个约束的字长 = 24 位。
最终答案是 A(24 位)。
验证 a=5 的方案能装下指令编码:
- 三地址操作码:用 5 位编码 29 条 → 余 32 - 29 = 3 种前缀做扩展
- 二地址操作码:每种扩展前缀 + 6 位扩展段 = ✓
易错点速查:
- "至少"= 按最紧凑设计算,不要预留太多操作码位
- 算出最小理论字长后,按字节编址要圆整到 8 的倍数
- 扩展操作码方法:(2^短 - 已用) × 2^(长-短) ≥ 长格式所需