我正在尝试在MIPS中创建合并排序算法,我已经在我的代码中发现了一个错误。在我的程序中,我将保持对数组的起点和终点的引用(分别为$a0
和$a1
)。我也跟踪它的长度$a1 - $a0 + 4
。问题是我不知道如何正确计算数组的中点。我需要在C:
mergesort(a, start, mid);
mergesort(a, mid + 1, end);
我是MIPS的新手,所以我不确定你是如何使用4位地址进行算术运算的。我无法将它们添加为($a0 + $a1)/2
,因为添加两个地址会导致溢出。
我的数组被声明为:
array: .word 0:15
我可以假设输入的数字不会超过15个。 $s0
(指向数组开头的指针),$s1
(指向最后一个元素后面的空格的指针),$a0
(起点参数)和{{1} (结束点参数)都存储如下:
$a1
如果将$ a0和$ a1作为参考,我如何计算该数组的中间索引?任何帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
($a0 + $a1) / 2 = $a0 + ($a1 - $a0) / 2
你不会有任何溢出。
答案 1 :(得分:0)
您无需担心中间溢出。只需使用无符号加法(无溢出)然后向右移一位除以2:
addu $a2, $a0, $a1 # $a0 and $a1 hold start and end addresses
srl $a2, $a2, 1 # $a2 holds mid address