我正在使用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
答案 0 :(得分:0)
我不知道任何MIPS汇编程序,但我似乎很清楚你是从堆栈指针中减去20来为本地存储提供一些空间,但你在两个地方添加了20个堆栈指针。 / p>