在MIPS中查找数组的中点 - 合并排序

时间:2012-11-03 17:41:15

标签: arrays assembly mips mergesort

我正在尝试在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作为参考,我如何计算该数组的中间索引?任何帮助,将不胜感激。谢谢!

2 个答案:

答案 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