如何使用 ALUSrc stuck-on-0 故障在 MIPS32 中重现 LW 和 SW 的功能

How to reproduce functionality for LW and SW in MIPS32 with an ALUSrc stuck-on-0 fault

ALUSrc 卡在 0。在这种情况下,可以重现 LW 和 SW 功能的交替 MIPS 操作系列是什么?

我是 MIPS 的新手,所以如果我在这里有什么不对的地方,请提前致歉。在这种假设情况下,ALUSrc 卡在 0,阻止立即值被读入 ALU。这自然会破坏大多数 I 型操作,包括 LW 和 SW。这个问题要求我用现有的 MIPS 指令创建替代的汇编代码,这些指令重现每个命令的功能。

我完全不知道如何将立即值输入处理器。我想有布尔运算和加法的选项,但我还没弄明白。感谢您的帮助。

编辑: 可能有很多方法可以产生一个简单的 1 或 -1 常量,然后可以用它来产生任何其他常量。以下代码序列将在需要时生成 1

   jal dummy           # puts address of jal+4 into $ra
dummy:
   sltu $v0, [=10=], $ra   # sets $v0=1 b/c we know that $ra > 0

从一个常量开始,我们可以通过移位、加、减或等来创建其他常量。例如,1 左移 10 得到 1024。 (偏移量是即时的,但 [10:6] 因此不受您的假设问题的影响。)


好的,现在,如果 ALUSrc 控制信号卡在 0 那么 ALU 将始终接收读取寄存器 2 数据读取值。

然后的想法是将这一点与硬件总是在做某事的事实结合起来,即使在不适合给定指令的情况下,如 LW.

实际上,卡住的 ALUSrc 控制信号将某些面向 ALU 的 I 型指令转换为 R 型指令——这给了我们一个 lw rt, (ra,rb),其中有效地址是 ra+rb 而不是 ra+sxt(imm)。 (分支使用 16 位立即数字段但不受此控制的影响;移位使用 5 位立即数也不使用此控制。

这意味着,例如,如果您将一个寄存器编号放在立即数字段的 [15:11] 中,ALU 将接收该寄存器的值(而不是立即数)。

因此,首先,我们可以在 LW 中使用所有零的立即值 [15:0],并且该立即值将具有 [15:11] 的所有零,这与stuck ALUSrc — 将向 ALU 提供 $0(其中包含零)。这意味着我们可以执行一些零偏移量的基本加载指令。


通过计算立即数和基数,然后使用偏移量为零的 lw/sw,然后我们可以模拟任意加载或存储。