1

ツリー トラバーサル ルーチンは、最初のノード、処理関数、順序定数の 3 つの引数を受け取ります。

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 のノードであると確信しています。

4

1 に答える 1

0

ジェフが言ったこと。具体的には、一時変数は上書きされないという保証がないため、s0overを使用する必要がありますが、関数を呼び出すと、レジスタは保存および復元されることが「約束」されています。呼び出しごとに独自の関数で上書きしたくない場合は、スタックにさらに4バイトを追加し、保存して復元する必要があります。t0s*s0

于 2013-01-23T02:12:01.237 に答える