MIPS汇编语言堆栈指针合并排序

时间:2012-03-20 08:40:40

标签: assembly mips mergesort

我正在使用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 :(得分:0)

我不知道任何MIPS汇编程序,但我似乎很清楚你是从堆栈指针中减去20来为本地存储提供一些空间,但你在两个地方添加了20个堆栈指针。 / p>