Recursion MIPS-递归中两个数的GCD

Recursion MIPS-递归中两个数的GCD,recursion,mips32,Recursion,Mips32,我试图用递归法求两个数的GCD。 这段代码是我到目前为止所做的,但显然它进入了一个无限循环,我不明白为什么以及如何解决这个问题。 我会很感激你的帮助 .data string1: .asciiz "Enter the first number: " string2: .asciiz "Enter the second number: " string3: .asciiz "GCD is : " .text li $v0,4 la $a0,string1 syscall li $v0,

我试图用递归法求两个数的GCD。 这段代码是我到目前为止所做的,但显然它进入了一个无限循环,我不明白为什么以及如何解决这个问题。 我会很感激你的帮助

.data
string1: .asciiz "Enter the first number:  "
string2: .asciiz "Enter the second number:  "
string3: .asciiz "GCD is : "

.text

li $v0,4
la $a0,string1
syscall

li $v0, 5
syscall
add $s0,$v0,$zero  #s0 = first number

li $v0,4
la $a0,string2
syscall

li $v0, 5
syscall
add $s1,$v0,$zero   #s1= second number




slt $t0,$s0,$s1
beq $t0,$zero,L    # if first number < second number , swap
add $t1,$s0,$zero
add $s0,$s1,$zero
add $s1,$t1,$zero

L: 
add $a0,$s0,$zero   # put first number in $a0 as input argument
add $a1,$s1,$zero   # put second number in $a1 as input argument



jal GCD

GCD:

addi $sp,$sp,-4
sw $ra,0($sp)


bne $a1,$zero,L1  # base case condition

add $v0,$zero,$a0  # if base case is true
addi $sp,$sp,4
jr $ra


L1:
div $a0,$a1
add $a0,$a1,$zero
mfhi $a1
jal GCD


lw $ra,0($sp)
addi $sp,$sp,4

jr $ra


add $s3,$v0,$zero  # put result in $s3


li $v0,4
la $a0,string3
syscall


li $v0,1
add $a0,$s3,$zero
syscall
.data
string1:.asciiz“输入第一个数字:”
string2:.asciiz“输入第二个数字:”
字符串3:.asciiz“GCD为:”
.文本
李$v0,4
洛杉矶$a0,string1
系统调用
李$v0,5
系统调用
加上$s0、$v0、$0#s0=第一个数字
李$v0,4
洛杉矶$a0,string2
系统调用
李$v0,5
系统调用
加上$s1、$v0、$0#s1=第二个数字
slt$t0、$s0、$s1
beq$t0,$0,L#如果第一个数字<第二个数字,交换
加上$t1、$s0、$0
加上$s0、$s1、$0
加上$s1、$t1、$0
L:
添加$a0、$s0、$零#将$a0中的第一个数字作为输入参数
添加$a1、$s1、$zero#在$a1中放入第二个数字作为输入参数
日航GCD
GCD:
附加$sp,$sp,-4
西南$ra,0($sp)
bne$a1,$0,L1#基本情况条件
如果基本情况为真,则添加$v0、$0、$a0
附加$sp,$sp,4
jr$ra
L1:
分区$a0,$a1
加上$a0、$a1、$0
mfhi$a1
日航GCD
lw$ra,0$sp
附加$sp,$sp,4
jr$ra
添加$s3、$v0、$零#将结果放入$s3
李$v0,4
洛杉矶$a0,string3
系统调用
李$v0,1
加上$a0、$s3、$0
系统调用

因此,您的程序从
.text
段的开头开始执行,并直接在
L
标签后的行
jal GCD
上继续执行

接下来,您的程序跳转到
GCD
标签,在该标签上执行,直到
jr$ra
返回到
jal
,这当然是
GCD
的下一条指令。这将导致无限循环

所以这里的问题是在主函数的中间插入了<代码> GCD < /代码>函数。一般来说,
jal
到下一行总是错误的


<>你应该在别处移动<代码> GCD 的定义,并考虑在这个函数返回之后你想运行什么。

在调试器中运行程序应该给你一些关于它在哪里和为什么会发生的提示。非常感谢。我还在函数调用之后和GCD标签之前添加了一个跳转,并将其标签放在GCD函数之后。那也行,很好。如果它对您有效,请接受答案。:)