我将在前面加上两件事。一,我绝对没有装配经验。其中两个用于我大学的编程项目。我试图递归地解决河内塔问题,我有一个基本的结构轮廓,我只是想填写我想出来的最新情况。我当前的问题是,当我有一个应该是结束消息的syscall
时,我的输出无限循环。问题是,当我包含它时,它会无限循环,但随着它的删除,它只会通过我所拥有和结束,就像我希望它与那里的消息一样。以下是我到目前为止的情况:
#############################################
# $a0 - Origin Peg #
# $a1 - Intermediate Peg #
# $a2 - Destination Peg #
# $a3 - N discs #
# $ra - for return #
#############################################
.data
startMsg: .asciiz "Moving n discs" #will have to change to account for n
moveMsg: .asciiz "move a disc: "
arrow: .asciiz " -> "
endMsg: .asciiz "End of process"
.text
.globl main
main:
li $a3, 4 #Four Discs loaded into register a3
li $v0, 4
la $a0, startMsg #Load address for first output message
syscall #Display message
jal recHanoi
li $v0, 4
la $a0, endMsg #Load address for last output message
syscall #Display end message
jr $31
recHanoi:
subu $sp, $sp, 32
sw $a0, 0($sp)
sw $a1, 4($sp)
sw $a2, 8($sp)
li $v0, 4
la $a0, arrow #Load address for first output message
syscall #Display message
#will do recursive calculation stuff here
#
#.
#.
#.
#
j restore
restore:
lw $a0, 0($sp)
lw $a1, 4($sp)
lw $a2, 8($sp)
addu $sp, $sp, 32
jr $ra
当我删除jal
之后的三行时,没有无穷大。这不一定是目前不能继续前进,但我想更好地了解究竟是什么导致了这一点,因为目前我并不明白。是否存在某种类型的注册冲突,这是其根源还是什么?
编辑:我应该提一下输出是什么。这是消息“过程结束”一遍又一遍。这就是为什么这对我来说如此陌生,因为我认为它会在某些时候跳入我的recHanoi,但事实并非如此。
Edit2:抱歉,结束信息无法启动