2012-03-20 20 views
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 

答えて

0

私は、任意のMIPSアセンブラを知らないが、あなたがローカル・ストレージのためのいくつかのスペースを提供するために、スタックポインタから20を引いているように私には明確なようだが、あなたは、スタックポインタに戻すに20を追加します2つの場所。

+0

最後の1つをキャンセルしますが、それは正しいです。私はスペースを作成するので、すべての再帰で新しい値を保存できます。 lo> hiの後に、20を戻して値をレジスタにロードし、ここにないマージピースを実行します。そして、20を加えて、次の値のセットをロードしてmerge_sortを実行します。その再帰的な実行は、私は無限ループまたは何か他のものを取得します。 –