-1

次のアセンブリ コードは、私の教科書に記載されています。

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

このコードから、2 つの質問があります。

最初の質問は、上から 2 行目についてです。命令sll左シフト論理であり、ビットを左にシフトします。シフト量が2なので、10進数で0000→0100=4となります。しかし、私は最初のループの後にそれを取得しません。これを左に 2 ずらすと 4 倍以上になりませんか??

2 番目の質問は、このコードを最適化できるかどうかです?? 私の意見でsllは、コードの一部を変更および追加できますが、よくわかりません。任意のコメント??

4

3 に答える 3

1

左にシフトすると、1 ではなく 0 が挿入されます。したがって、0000 は 0000 のままで、0001 はシフト後に 0100 になります。

于 2013-10-04T02:51:57.787 に答える
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
于 2013-10-04T09:21:45.363 に答える