循环中的MIPS汇编代码

时间:2013-10-04 02:09:56

标签: mips

愚弄汇编代码在我的教科书中给出。

Loop:
sll $t1, $t0, 2 
add $t2, $a0, $t1
sw $zero, 0($t2)

addi $t0, $t0, 1
slt $t3, $t0, $a1
bne $t3, $zero, Loop

# return where we were
jr $ra

从这段代码我有两个问题。 第一个问题是关于从顶部开始的第二行。 我得到了指令sll:向左移位逻辑,将位移到左边。由于移位量为2,因此将使0000 - > 0100 =十进制4。但是我在第一次循环后没有得到它。如果我们将它向左移动2,不是它乘以4以上? 第二个问题是,是否可以优化此代码?在我看来,我可以修改sll并在代码中添加部分,但我不确定。 任何评论??

3 个答案:

答案 0 :(得分:0)

向左移动将插入0,而不是1。所以0000仍然是0000,移位后0001将变为0100

答案 1 :(得分:0)

  

[是否]可以优化此代码?

做同样事情的更紧凑方式是:

sll $a1, $a1, 2
addu $a1, $a1, $a0   # $a1 = $a1 * 4 + $a0
Loop:
sw $zero, ($a0)
addiu $a0, $a0, 4
bne $a0, $a1, Loop

我正在做出这些假设:

  • 循环结束后不再需要$a0$a1的原始值。如果需要 ,请在进入循环之前将原始值保存在某处(在其他寄存器或堆栈中),然后再恢复它们。
  • $t0从零开始。如果没有,您必须在循环之前将$t0 * 4添加到$a0。我还假设退出循环后$t0的值无关紧要。

答案 2 :(得分:0)

考虑以下二进制文件:

0000 0001

如果你将这些位向左移1位,你会得到:

0000 0010

如果再向左移1位数:

0000 0100

再次:

0000 1000

上面的二进制值相当于1; 1×2 = 2; 2×2 = 4; 4×2 = 8。 如果N是您正在移位的位数,则将位向左移位将该值乘以2 ^ N.

另一个转变的例子:

Assume $t1 contains 0000 1111

sll $t0, $t1, 3    # $t0 = $t1 * 2^3

Now $t0 contains 0111 1000

您可以通过执行十进制乘法来验证这一点。 15 * 8 = 120。