【问题标题】:Why does this stop after the first 3 numbers with a mips tree traversal?为什么这会在 mips 树遍历的前 3 个数字之后停止?
【发布时间】:2012-04-24 18:15:31
【问题描述】:

树遍历例程接受 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

程序在遇到第三个元素时停止。我很确定这个元素是一个两个叶子都为空的节点。

【问题讨论】:

  • 您的$t0 被每个jal traverse_tree 破坏——在您从它返回后,$t0 将不一样。尝试在开始时也推送$t0(并在最后弹出)。

标签: assembly tree mips traversal


【解决方案1】:

杰夫说的。具体来说,您应该使用s0 而不是t0,因为临时变量不能保证不会被覆盖,但是s* 寄存器“承诺”在您调用函数时会被保存和恢复。如果您不希望自己的函数在每次调用时都覆盖它,您自己需要再向堆栈添加 4 个字节并保存并恢复 s0

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2011-11-13
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多