2012-04-24 2 views
1

Процедура обхода дерева принимает три аргумента, первый узел, функцию обработки и константу порядка.Почему это останавливается после первых трех чисел с обрывом дерева?

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 

Программа останавливается, когда она попадает в третий элемент. Я уверен, что этот элемент является узлом с обоими листьями null.

+1

Ваш '$ t0' сбивается с каждым' jal traverse_tree' - после того, как вы вернетесь из него, '$ t0' не будет одинаковым. Попробуйте нажать '$ t0' также и в начале (и поместите его в конец). –

ответ

0

Что сказал Джефф. В частности, вы должны использовать s0 по сравнению с t0, поскольку временные переменные не имеют уверенности в том, что они не перезаписаны, однако s* регистры «обещаны» для сохранения и восстановления при вызове функции. Вы сами должны добавить еще 4 байта в стек и сохранить и восстановить s0, если вы не хотите, чтобы ваша собственная функция перезаписывала каждый вызов.

Смежные вопросы