Я работаю над алгоритмом сортировки слиянием на языке ассемблера MIPS, и у меня возникают проблемы с указателем стека и адресом возврата.Кажется, я слишком рано выскакиваю, когда выхожу из алгоритма сортировки слиянием.У меня просто список из 20 случайных чисел, которые должны быть отсортированы.Теоретически это должно работать, но на данный момент это не работает из-за моего стека.У меня проблема с выходом из кода слияния.Любая помощь будет очень признательна.Я пошлю весь код, если это будет необходимо.Я бегу на xspim или spimsal.Работаю над этим уже много дней.
merge_sort:
slt $t0, $s0, $s1 # $t0=1 if lo<hi
bne $t0, $zero, L1 # if lo<hi branch to L1
jr $ra
L1: add $t0, $s0, $s1 # t0 = lo+hi
div $s2, $t0, 2 # m=lo+hi/2
addi $sp, $sp, -20 #increase stack
sw $ra, 16($sp) #push values on stack
sw $a0, 12($sp)
sw $s2, 8($sp) # m
sw $s1, 4($sp) # hi
sw $s0, 0($sp) # lo
add $s1, $s2, $zero # hi=m
jal merge_sort # merge_sort(a(a0), ?, $s0, $) also $ra
addi $sp, $sp, -20 #increase stack
sw $ra, 16($sp) #push values on stack
sw $a0, 12($sp)
sw $s2, 8($sp) # m
sw $s1, 4($sp) # hi
sw $s0, 0($sp) # lo
addi $s0, $s2, 1 # lo=m+1
jal merge_sort # merge_sort also $ra(return address)
addi $sp, $sp, 20 #decrement and pop values off stack
lw $s0, 0($sp)
lw $s1, 4($sp)
lw $s2, 8($sp)
lw $a0, 12($sp)
jal merge #jump to merge also return address
lw $s0, 0($sp) #load values
lw $s1, 4($sp)
lw $s2, 8($sp)
lw $a0, 12($sp)
lw $ra, 16($sp)
addi $sp, $sp 20 #decrement stack
jr $ra #return to second merge_sort