2

MIPS でマージ ソート アルゴリズムを作成しようとしていますが、コードにバグがあることがわかりました。私のプログラムでは、配列の開始点と終了点 ($a0および$a1それぞれ) への参照を保持しています。また、その長さを として追跡してい$a1 - $a0 + 4ます。問題は、配列の中点を正しく計算する方法がわからないことです。C でのこれらの同等の関数呼び出しについては、そうする必要があります。

mergesort(a, start, mid);
mergesort(a, mid + 1, end);

私は MIPS を初めて使用するので、4 ビット アドレスを使って算術演算を行う方法が正確にはわかりません。($a0 + $a1)/22 つのアドレスを追加するとオーバーフローが発生するため、追加できません。

私の配列は、次のように上で宣言されています。

array: .word 0:15

入力される数字は 15 個以下であると想定できます。$s0(配列の先頭へのポインター)、$s1(最後の要素の後のスペースへのポインター)、$a0(開始点の引数)、および$a1(終点の引数) はすべて次のように格納されます。

la $s0, array
move $s1, $s0 // $s1 increments by 4 each time an element is added
...
move $a0, $s0
addi $a1, $s1, -4 // subtract four because we want to refer to the last element

$a0 と $a1 を参照として指定すると、その配列の中間インデックスを計算するにはどうすればよいですか? どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

1

($a0 + $a1) / 2 = $a0 + ($a1 - $a0) / 2オーバーフローはありません。

于 2012-11-04T02:20:36.373 に答える
0

中間オーバーフローについて心配する必要はありません。符号なし加算 (オーバーフローなし) を使用してから、1 ビット右にシフトして 2 で除算します。

  addu $a2, $a0, $a1  # $a0 and $a1 hold start and end addresses
  srl $a2, $a2, 1     # $a2 holds mid address
于 2012-11-05T15:26:00.390 に答える