Поиск середины массива в MIPS-сортировка слиянием


Я пытаюсь создать алгоритм сортировки слиянием в 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 в качестве ссылок? Любая помощь будет оценена по достоинству. Спасибо!

2 2

2 ответа:

($a0 + $a1) / 2 = $a0 + ($a1 - $a0) / 2 и у вас не будет никакого переполнения.

Вам не нужно беспокоиться о промежуточном переполнении. Просто используйте сложение без знака (без переполнения), а затем сдвиньте вправо один бит, чтобы разделить на два:

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