2012-11-03 42 views
2

我試圖在MIPS中創建一個合併排序算法,並且在我的代碼中發現了一個錯誤。在我的程序中,我保持對陣列的起點和終點的引用(分別爲$a0$a1)。我也跟蹤其長度爲$a1 - $a0 + 4。問題是我不知道如何正確計算陣列的中點。我必須這樣做,這些功能相當於在C調用:在MIPS中查找數組的中點 - 合併排序

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

我是新來的MIPS所以我不清楚自己是如何做的4位地址的算法。我不能將它們添加爲($a0 + $a1)/2,因爲添加兩個地址會導致溢出。

我的數組聲明瞭在頂部,這樣的:

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作爲參考的數組的中間索引?任何幫助,將不勝感激。謝謝!

回答

1

($a0 + $a1)/2 = $a0 + ($a1 - $a0)/2而且你不會有任何溢出。

0

您不必擔心中間溢出。只需使用無符號加法(無溢出),然後右移一位以除以二:

addu $a2, $a0, $a1 # $a0 and $a1 hold start and end addresses 
    srl $a2, $a2, 1  # $a2 holds mid address