2

我正在尝试在 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(起点参数)和$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

您无需担心中间溢出。只需使用无符号加法(无溢出),然后右移一位以除以二:

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