用 MIPS 中的其他指令替换左逻辑移位

Replacing left logical shifts with other instructions in MIPS

假设我们有两个寄存器 $s0 和 $s1。寄存器 $s0 可以取 0 到 31 之间的值,用于显示寄存器 $s1 将左移多少位。我如何在不使用 sll 或 srl 的情况下执行此操作。我知道逻辑左移 n 位与乘以 2^n 相同。这个练习暗示这只需要 4 条指令就可以完成。两个寄存器都是 32 位的。

您可以将 $s1 与自身相加 $s0 次(每次它将其值乘以 2,即向左移动一次)。

代码如下所示:

 beqz $s0, end
loop:
  add $s1, $s1, $s1
  subu $s0, $s0, 1
  bnez $s0, loop  
end:

第一个条件分支是确保当 $s0 的值为零时不对 $s1 采取任何操作。