用 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
采取任何操作。
假设我们有两个寄存器 $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
采取任何操作。