启动无限循环的GCD mips程序

启动无限循环的GCD mips程序,mips,greatest-common-divisor,Mips,Greatest Common Divisor,我认为我的堆栈有问题。我一步一步地运行它几次,每次它到达这一部分时,它都会正常工作,直到发现数字不等于零的分支继续重复,但它只会跳回GCD,而堆栈或参数没有任何变化,从而开始无限循环。 我试着把a放在第一个日航GCD的前面重复,但程序在达到lw$a2、8$s1后会停止,并给我一个例外。我该怎么做才能使商数取代参数2并继续搜索GCD GCD: addi $sp, $sp, -16 # sw $ra, 0($sp) #set stack sw $s0, 4($sp) #

我认为我的堆栈有问题。我一步一步地运行它几次,每次它到达这一部分时,它都会正常工作,直到发现数字不等于零的分支继续重复,但它只会跳回GCD,而堆栈或参数没有任何变化,从而开始无限循环。 我试着把a放在第一个日航GCD的前面重复,但程序在达到lw$a2、8$s1后会停止,并给我一个例外。我该怎么做才能使商数取代参数2并继续搜索GCD

GCD: 
addi $sp, $sp, -16  #   
sw $ra, 0($sp)      #set stack
sw $s0, 4($sp)      #
sw $a1, 8($sp)      #
sw $a2, 12($sp)     #

div $a1, $a2        #n1/n2
mfhi $s1
bnez $s1, repeat    #repeat until equals 0

addi $v0, $a2, 0
addi $sp, $sp, 16

jr $ra          #return gcd

repeat:
jal GCD
lw $a1, 4($sp)
lw $a2, 8($s1)
jal GCD
lw $a1, 4($sp)
lw $a2, 8($sp)
jr $ra

根据我对GCD的回忆,对于每一步,如果没有出现零,程序应该将$a2移动到$a1,然后将除法中的余数移动到$a2,然后循环回div指令,而不是返回GCD。

这里有一个mips代码来查找两个数字的GCD

.data
num1:.asciiz"Enter the first value:"
num2: .asciiz"Enter the second value:"

.text
.globl main
main:
    li $v0,4
    la $a0,num1
    syscall
    
    li  $v0, 5      #User Input for num1
    syscall
    move $t0,$v0 #Storing user input in another register since $a0 will be occupied in the next command
  
    li $v0,4
    la $a0,num2
    syscall

    li  $v0, 5      #User input for num2
    syscall
    move $a1,$v0
    move $a0,$t0    #Transfering the user input for num1 in $a0

    jal GCD #Calling GCD func

    add $a0,$v0,$zero 
    li $v0,1
    syscall # print result
    li $v0, 10 # exit the program
    syscall
    
GCD:
    #GCD(num1, num2)
    # num1 = $a0
    # num2 = $a1

    addi $sp, $sp, -12
    sw $ra, 0($sp) # Func stored in stack
    sw $s0, 4($sp) # Value stored in stack
    sw $s1, 8($sp) # Value stored in stack

    add $s0, $a0, $zero # s0 = a0 ( value num1 ) 
    add $s1, $a1, $zero # s1 = a1 ( value num2 ) 

    addi $t1, $zero, 0 # $t1 = 0
    beq $s1, $t1, return # if s1 == 0 return

    add $a0, $zero, $s1 # make a0 = $s1
    div $s0, $s1 # num1/num2
    mfhi $a1 # reminder of num1/num2 = to num1%num2

    jal GCD
    
exitGCD:
    lw $ra, 0 ($sp)  # read registers from stack
    lw $s0, 4 ($sp)
    lw $s1, 8 ($sp)
    addi $sp,$sp , 12 # bring back stack pointer
    jr $ra
return:
    add $v0, $zero, $s0 # return $v0 = $s0 ( num1)
    j exitGCD   

是的,就是这样。我迷失在堆栈部分,并试图使用它。我对堆栈的理解是有限的,我不认为我的重复部分是正确的。你是说我应该让它跳过堆栈部分或类似的东西,而不是在整个GCD中循环?是的,在div指令之前需要一个标签,并且需要循环回该指令。重复后的代码不应该使用任何基于堆栈的值,它应该只使用寄存器中的值。好的,我已经修复了循环,但是我仍然很难使用堆栈并理解如何实现它。如何确定要更改的内容以及是否有关于使用堆栈和了解堆栈的更多信息的页面?对于此特定函数,您不需要使用堆栈,因为该函数不调用任何其他函数,不需要保存$ra,也不需要保存$a0-$a3或$v0-$v1。您应该以$v0的形式返回结果。