2
MIPSアセンブリ言語でマージソートアルゴリズムを使用しており、スタックポインタとリターンアドレスに問題があります。私はマージソートアルゴリズムから自分のやり方を工夫しているときに早すぎるようになっているようだ。私はちょうど並べ替えることになっている20の乱数のリストを持っています。理論的には、それは動作するはずですが、この時点ではスタックのために動作しません。私は問題がマージコードから出てきている。どんな助けでも大いに感謝しています。必要に応じてコード全体を送信します。私はxspimまたはspimsalで動作しています。今これを数日間働いています。MIPSアセンブリ言語スタックポインタマージソート
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つをキャンセルしますが、それは正しいです。私はスペースを作成するので、すべての再帰で新しい値を保存できます。 lo> hiの後に、20を戻して値をレジスタにロードし、ここにないマージピースを実行します。そして、20を加えて、次の値のセットをロードしてmerge_sortを実行します。その再帰的な実行は、私は無限ループまたは何か他のものを取得します。 –