Assembly MIPS汇编中的无限循环
我将以两件事作为序言。第一,我绝对没有组装经验。这是我大学的一个程序设计项目。我试着递归地解决河内塔的问题,我有一个基本的结构大纲,我只是试着在我弄明白它的时候填充需要的东西。我当前的问题是,当我有一个Assembly MIPS汇编中的无限循环,assembly,recursion,Assembly,Recursion,我将以两件事作为序言。第一,我绝对没有组装经验。这是我大学的一个程序设计项目。我试着递归地解决河内塔的问题,我有一个基本的结构大纲,我只是试着在我弄明白它的时候填充需要的东西。我当前的问题是,当我有一个syscall作为结束消息时,我的输出会无限循环。问题是,当我包含它时,它会无限循环,但随着它的删除,它只会遍历我所拥有的内容,并结束,就像我期望它对那里的消息所做的那样。以下是我到目前为止的情况: ############################################# #
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
后面的三行时,没有无穷大。这并不一定会阻碍目前的进展,但我想更好地理解到底是什么导致了这一点,因为目前我还不清楚。是否存在某种类型的寄存器冲突是这一问题的根源
编辑:我可能应该提到输出是什么。这是一遍又一遍的“过程结束”的信息。这就是为什么这对我来说是如此陌生,因为我认为它会在某个时候跳到我的里卡诺,但事实并非如此
Edit2:抱歉,这是结束消息“未开始”
$31
是$ra
。当您执行jal recHanoi
时,$ra
被设置为jal
后面的指令地址(即li$v0,4
),因此您不断地跳回那里。您可以将原始的$ra
保存在堆栈上,但我建议您使用syscall 10退出您的程序。@Michael啊,我对此一无所知。我不知道他们提到的是同一个登记册。我真的不知道你所说的系统调用10是什么意思。我是否以与其他系统调用相同的方式使用它?是否有特殊登记簿?请参阅以下任何一种。