如何使用 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
,然后我们可以模拟任意加载或存储。
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
,然后我们可以模拟任意加载或存储。