Appearance
题目
假定计算机 M 字长为 16 位,按字节编址,连接 CPU 和主存的系统总线中地址线为 20 位、数据线为 8 位,采用 16 位定长指令字,指令格式及其说明如下:
R 型:R[rd] ← R[rs] op1 R[rt]
I 型(含 ALU 运算、条件转移和访存操作三种指令)
J 型:PC 的低 10 位 ← target
其中,op1~op3 为操作码,rs、rt 和 rd 为通用寄存器编号,R[r] 表示寄存器 r 的内容,imm 为立即数,target 为转移目标的形式地址。请回答下列问题。
(1) ALU 的宽度是多少位?可寻址主存空间大小为多少字节?指令寄存器、主存地址寄存器(MAR)和主存数据寄存器(MDR)分别应有多少位?
(2) R 型格式最多可定义多少种操作?I 型和 J 型格式总共最多可定义多少种操作?通用寄存器最多有多少个?
(3) 假定 op1 为 0010 和 0011 时,分别表示带符号整数减法和带符号整数乘法指令,则指令 01B2H 的功能是什么(参考上述指令功能说明的格式进行描述)?若 1、2、3 号通用寄存器当前内容分别为 B052H、0008H、0020H,则分别执行指令 01B2H 和 01B3H 后,3 号通用寄存器内容各是什么?各自结果是否溢出?
(4) 若采用 I 型格式的访存指令中 imm(偏移量)为带符号整数,则地址计算时应对 imm 进行零扩展还是符号扩展?
(5) 无条件转移指令可以采用上述哪种指令格式?
解析
本题考查 类 MIPS 风格的三种指令格式(R / I / J 型)+ 系统总线 + 寄存器位宽。读取要点:
- 指令字段拆分决定了 ALU、寄存器组、立即数、跳转目标的容量上限;
- ALU、IR、MAR、MDR 各有自己的位宽来源——别张冠李戴:ALU 与字长一致,IR 与指令长度一致,MAR 与地址总线宽度一致,MDR 与数据总线宽度一致。
(1) ALU 宽度与三大寄存器位数 [4 分]
| 部件 | 位数 | 来源 |
|---|---|---|
| ALU | 16 | 字长 16 位(ALU 一次处理 1 个字宽的运算) |
| 主存空间 | B = 1 MB | 地址线 20 位、按字节编址 |
| 指令寄存器(IR) | 16 | 指令字长 16 位 |
| MAR | 20 | 地址线宽度(要发出 20 位主存地址) |
| MDR | 8 | 数据线宽度(一次只能传 8 位) |
易错点: 数据线 8 位但字长 16 位 → 一次取一个 16 位指令需 2 次主存访问。MDR 仍按数据线宽度(8 位),不会因为字长是 16 而扩到 16。
(2) R / I / J 型最多操作种类 + 通用寄存器数 [4 分]
R 型操作码 = 低 4 位 op1:
I 型与 J 型共享高 6 位操作码空间: 但前 6 位全 0 的编码已分给 R 型(R 型高 6 位固定 000000),故:
通用寄存器数: R 型和 I 型中 rs / rt / rd 字段都是 2 位 → 寄存器编号 0~3:
编者注(生僻术语): 真实 MIPS 是 5 位寄存器编号 → 32 个通用寄存器。本题压缩到 2 位是为题面简洁,同时受限于 16 位指令字。
(3) 指令 01B2H、01B3H 的功能与溢出判断 [4 分]
Step 1. 译码 01B2H。
按 R 型字段 [op = 000000 | rs = 01 | rt = 10 | rd = 11 | op1 = 0010]:
- op =
000000→ R 型; - rs =
01= R1; - rt =
10= R2; - rd =
11= R3; - op1 =
0010→ 带符号减法。
功能: 。
Step 2. 算 01B2H 的结果。
溢出判断(带符号): B052H 最高位 1(视为负),0008H 最高位 0(正)。负减正 → 应得更负的负数 = B04AH,最高位仍为 1(仍为负数),符号未跳变 → 不溢出。
Step 3. 译码 01B3H。
字段同 01B2H,仅 op1 = 0011 → 带符号乘法。
功能: 。
Step 4. 算 01B3H 的结果。
把 B052H 视作 16 位补码:B052H 最高位 1 → 负数。其绝对值 = ,故 R[1] = 。
R[2] = 0008H = 8。
16 位补码表示范围 , 远超出 → 溢出。
低 16 位结果(按位级运算):
取低 16 位 = 8290H,按 16 位补码读为 。
易错点: 别只看符号位。带符号乘法溢出判断要把 32 位真实积截到 16 位后看 高 17 位是否都是符号位的扩展——这等价于"截断后值是否等于真实值"。本题真实值 与截断后 不等,确认溢出。
(4) I 型访存指令的 imm 应零扩展还是符号扩展?[1 分]
应符号扩展。
理由: imm 表示偏移量(向前 / 向后),是带符号整数。零扩展会把所有负偏移变成大正数(加到基址寄存器后跳到错误的高地址),与"反向跳转"的需求矛盾。符号扩展能保留正负号语义,让 imm 的真实值不变。
(5) 无条件转移用什么格式?[1 分]
J 型。
J 型结构:[op3 6 位 | target 10 位]。无条件转移把 target 字段写入 PC 的低 10 位(高 6 位保持不变)→ 直接跳到由当前 PC 高 6 位 + target 拼接出的地址。target 10 位提供 = 1024 字节的"段内"跳转范围。
编者注(生僻术语): 这种"高位 PC 不变 + 低位绝对寻址"的方式是 J 型跳转的特征。与 I 型的相对寻址(PC + 偏移)不同,J 型是"段内绝对寻址"——跳转范围更大,但跨段时无能为力。MIPS 的
j指令也是这个模式。