2013-10-04 166 views
0

汇编汇编代码在我的教科书中给出。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 

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

回答

0

左移将插入0的,而不是1的。所以0000仍然是0000,0001将在转变后变为0100

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的值是无关紧要的。
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.