愚弄汇编代码在我的教科书中给出。
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并在代码中添加部分,但我不确定。 任何评论??
答案 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。