Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS汇编中的无限循环_Assembly_Recursion - Fatal编程技术网

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是什么意思。我是否以与其他系统调用相同的方式使用它?是否有特殊登记簿?请参阅以下任何一种。