Recursion MIPS-递归中两个数的GCD
我试图用递归法求两个数的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,
.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函数之后。那也行,很好。如果它对您有效,请接受答案。:)