MIPS ассемблерный языковой стек указатель слияния сортировка - PullRequest
2 голосов
/ 20 марта 2012

Я работаю над алгоритмом сортировки слиянием на языке ассемблера 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

1 Ответ

0 голосов
/ 20 марта 2012

Я не знаю ни одного ассемблера MIPS, но мне кажется, что вы вычитаете 20 из указателя стека, чтобы обеспечить некоторое пространство для локального хранилища, но вы добавляете 20 обратно в указатель стека в двух местах.

...