2012-04-24 5 views
1

ツリートラバーサルルーチンは3つの引数、最初のノード、処理関数、および次の定数を取ります。これは、最初の3つの数字の後にmipsツリーを走査した後に停止するのはなぜですか?

traverse_tree: 
    addi $sp,$sp,-8 
    sw  $ra,0($sp) 
    sw  $a0,4($sp) 

    beq  $a0,$zero,done 
    move $t3,$a2 
    move $t2,$a1 
    move $t0,$a0 
    li  $t1,PRE_ORDER 
    beq  $t3,$t1,preorder 
    li  $t1,IN_ORDER 
    beq  $t3,$t1,inorder 
    li  $t1,POST_ORDER 
    beq  $t3,$t1,postorder 

preorder: 

    jalr $t2 
    lw  $a0,4($t0) 
    jal  traverse_tree 
    lw  $a0,8($t0) 
    jal  traverse_tree 
    jal  done 


inorder: 
    lw  $a0,4($t0) 
    jal  traverse_tree 
    move $a0,$t0 
    jalr $t2 
    lw  $a0,8($t0) 
    jal  traverse_tree 
    jal  done 

postorder: 
    lw  $a0,4($t0) 
    jal  traverse_tree 
    lw  $a0,8($t0) 
    jal  traverse_tree 
    move $a0,$t0 
    jalr $t2 
    jal  done 


done: 
    lw  $ra,0($sp) 
    lw  $a0,4($sp) 
    addi $sp,$sp,8 
    jr  $ra 

プログラムは3番目の要素に当たると停止します。私はかなりこの要素が両方のnullを持つノードであることを確かめています。

+1

'$ t0'はそれぞれの' jal traverse_tree'でclobberedされています。あなたが戻った後、 '$ t0'は同じではありません。開始時に '$ t0'を押してみてください(そして最後にポップしてください)。 –

答えて

0

ジェフが言ったこと。具体的にはt0を超えるs0を使用する必要があります。ただし、一時変数は上書きされないという保証はないため、​​レジスタは関数呼び出し時に保存され、復元されることを約束します。スタックに4バイトを追加して、自分の関数がすべての呼び出しを上書きすることを望まない場合は、s0を保存して復元する必要があります。

関連する問題