(1)通用寄存器数量与移位字段位数。
指令的 rs1、rs2、rd 都用 5 位编码寄存器编号,共可表示 25=32 个编号,所以 M 最多有 32 个通用寄存器。字段位数限制的是可编码的数量,不能仅凭一个示例寄存器编号推断数量。
M 的字长为 32 位,一次对一个机器字进行移位,移位量编码范围为 0~31,恰好有 32 种取值,故 shamt 需要 5 位。例如移位 2 的字段是 00010,移位 31 的字段是 11111。
(2)add 的控制信号、计算结果与溢出标志。
add 的功能是把两个源寄存器的内容相加。ALU 的 A 输入已来自 rs1,第二输入应选择 rs2 读出的 B。图中多路选择器的 B 输入标为 0,所以 ALUBsrc=0;若选 1,会错误地把扩展后的立即数送入 ALU。
把给定机器数相加:
87654321H
+ 98765432H
------------
11FDB9753H
ALU 结果 F 只有 32 位,保留低 8 个十六进制位,故 F=1FDB9753H。超出 32 位的最高进位为 1,所以 CF=1。
若按有符号补码看,两个操作数的最高位均为 1,都是负数;结果 1FDB9753H 的最高位却为 0,是正数。“同号相加,结果异号”说明有符号溢出,所以 OF=1。若该 add 处理无符号整数,判断溢出应查看 CF,因为无符号溢出的含义是和超过 232−1;OF 只判断补码有符号范围是否越界。相同的机器加法可同时产生这两个标志,程序根据数的解释选择相应标志。
(3)slli 为什么可以任选 Ext。
本题给定的 slli 编码中,IR[31:25] 固定为 0000000,IR[24:20] 才是 5 位 shamt。扩展器输入 IR[31:20] 的结构因此为 0000000 | shamt,这个 12 位数的最高位 IR[31] 必为 0。
零扩展在高位填 0;符号扩展复制最高位,而最高位也是 0。因此两种扩展的 整个 32 位输出完全相同,都表示同一个非负移位量。故 Ext 可以为 0,也可以为 1。这一结论直接来自本题的编码,不需另外假设移位器如何屏蔽高位。
(4)lw 的 Ext 与 ALUctr。
lw 的有效地址为 R[rs1]+imm,imm 是 12 位补码偏移量,可能为负数。要在 32 位 ALU 中保持其数值,必须把符号位扩展到高 20 位,故 Ext=1。若把负偏移量零扩展,就会把它误解释成一个较大的正数。
地址计算需要加法,题设规定 ALUctr=000 表示加,所以 ALUctr=000。此外,立即数应从选择器的 1 路进入 ALU,即 ALUBsrc=1;访存读取发生在地址计算之后。
(5)解码机器指令并计算存储地址。
按本题 lw 的字段位置拆解 A040A103H:
| 字段 |
位范围 |
二进制或十六进制值 |
意义 |
| imm |
31~20 |
A04H |
12 位补码偏移 |
| rs1 |
19~15 |
00001 |
基址寄存器编号 01H |
| 功能字段 |
14~12 |
010 |
与给定 lw 格式相符 |
| rd |
11~7 |
00010 |
目的寄存器编号 02H |
| 操作码 |
6~0 |
0000011 |
给定 lw 的操作码 |
其操作码与功能字段同时符合 lw,且与 add、slli 的操作码不同,因此在题设指令编码中可确定为 lw,汇编形式是 lw r2, -1532(r1)。
偏移 A04H 的 12 位符号位为 1,故有符号值为 A04H−1000H=−5FCH=−1532,符号扩展后为 FFFFFA04H。给定基址 R[01H]=FFFFA2D0H,有效地址为:
FFFFA2D0H - 000005FCH = FFFF9CD4H
因此读取数据的存储地址是 FFFF9CD4H。这里取的是基址加有符号偏移,目的寄存器 rd 的编号不参与地址计算。