我试图通过递归找到两个数字的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
答案 0 :(得分:2)
因此,您的程序会在.text
段的开头执行,并在jal GCD
标签后直接继续执行L
行。
接下来,您的程序会跳转到GCD
标签,直到jr $ra
使其返回到jal
,当然GCD
作为下一条指令GCD
。这会导致无限循环。
所以这里的问题是你在主函数的中间插入了jal
函数。一般来说,GCD
到下一行始终是错误的。
所以你应该将{{1}}的定义移到其他地方,并考虑从这个函数返回后你想要运行的是什么。