Appearance
题目
某计算机有 16 个通用寄存器,采用 32 位定长指令字,操作码字段(含寻址方式位)为 8 位,Store 指令的源操作数和目的操作数分别采用寄存器直接寻址和基址寻址方式。若基址寄存器可使用任一通用寄存器,且偏移量用补码表示,则 Store 指令中偏移量的取值范围是( )。
错因
B
知道 16 位补码范围,但把负侧和正侧的边界对称记错。 位补码的范围是 ——负数比正数多一个(即可表示 但不能表示 ),不是 。
C
把偏移量算成 17 位(或某个误算让范围 )。,所以 是 17 位补码 的范围。可能是漏算了一个寄存器域(少减了 4 位),或把"16 位补码"的指数 写成了 16 而不是 15。
D
双重错误叠加:先把偏移量字段位数算多了一位(17 位,例如漏算了源寄存器号字段,得 又凑成 17 位;或把"基址寻址 + 寄存器直接寻址"误以为只占一个寄存器域),再把补码范围方向也写反——本应是 (C 的写法),又把负正边界对称交换得到 。本质上是 C 的范围错 + B 的方向错叠在一起。
总解析
第一步:清点指令字内的字段
32 位指令字的字段构成:
| 字段 | 位宽 | 说明 |
|---|---|---|
| 操作码(含寻址方式位) | 8 | 题目直接给定 |
| 源操作数寄存器号(寄存器直接寻址) | 4 | 16 个寄存器 → 位 |
| 基址寄存器号(基址寻址用) | 4 | 同上,可用任一通用寄存器 |
| 偏移量 | ? | 剩下的位数 |
第二步:算偏移量字段的位宽
第三步:算 16 位补码的取值范围
位补码的取值范围公式:
代入 :
最终答案是 A(−32768 ~ +32767)。
关键易错点:
- 补码范围不对称:负数侧多一个( 是合法值, 不是)。这一点和 B 选项的对称范围互为镜像陷阱。
- 字段拆分要数清:基址寻址需要一个寄存器号(基址)+ 一个偏移量;源操作数寄存器直接寻址再用一个寄存器号。Store 指令字内一共两个寄存器号字段,缺一不可。
- "16 个寄存器需要 4 位编码":,背熟(也是流水线、Cache 题的常用底层步骤)。