如何在ALUSrc卡在0故障时重现MIPS32中LW和SW的功能

如何在ALUSrc卡在0故障时重现MIPS32中LW和SW的功能,mips,mips32,Mips,Mips32,ALUSrc卡在0上。在这种情况下,会再现LW和SW功能的一系列替代MIPS操作是什么 我是MIPS的新手,所以如果我在这里出错,请提前道歉。在这种假设的情况下,ALUSrc卡在0上,阻止立即值读入ALU。这自然会破坏大多数I型操作,包括LW和SW。这个问题要求我使用现有的MIPS指令创建替代汇编代码,这些指令再现每个命令的功能 我根本不知道如何将即时值输入处理器。我想有布尔运算和加法的选项,但我还没弄明白。谢谢您的帮助。编辑: 可能有很多方法可以产生一个简单的1或-1常量,然后可以用来产生任何

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, $0, $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位立即数字段,也不使用此控件

这意味着,例如,如果您在immediate字段的[15:11]中输入寄存器编号,ALU将接收该寄存器的值(而不是immediate)

因此,首先,我们可以在
LW
中使用一个全零的立即数[15:0],该立即数将具有[15:11]的所有零,这将使用一个卡住的ALUSrc向ALU提供$0(保持零)。这意味着我们可以使用零偏移量执行一些基本的加载指令



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

非常感谢您的回答!我理解如何使用零偏移量加载(使用$0),我知道你可以通过移位和布尔运算来生成常量。我不确定如何创建一条具有非0的任意偏移量的lw/sw指令,因为你必须对立即数值进行加法…如果我遗漏了一些明显的内容,请原谅。我该如何计算“立即数加基数”对于不使用addi的任意偏移量,在这种情况下,它当然会被破坏?我不知道我对XOR的想法是什么;我已经用另一个代码序列更新了一个
1
(用于构造任何其他常量)。