下面的汇编代码在我的课本中给出了。
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并在代码中添加部分,但我不确定。有什么评论吗?
发布于 2013-10-04 02:51:57
左移将插入0,而不是1。那么0000将仍然是0000,0001将在换班后变为0100。
发布于 2013-10-04 09:21:45
有可能优化这段代码吗?
做同样事情的一种更紧凑的方法是:
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值是不相关的。发布于 2013-10-04 23:46:17
考虑以下二进制文件:
0000 0001如果您移动1位数字所留下的位,您将得到:
0000 0010如果再次以1位数向左移动:
0000 0100又一次:
0000 1000上面的二进制值等价于1;1x2=2;2x2=4;4x2=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。
https://stackoverflow.com/questions/19172077
复制相似问题