MIPS中的两个数字的GCD-递归

时间:2014-03-02 20:59:38

标签: 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, 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

1 个答案:

答案 0 :(得分:2)

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

接下来,您的程序会跳转到GCD标签,直到jr $ra使其返回到jal,当然GCD作为下一条指令GCD。这会导致无限循环。

所以这里的问题是你在主函数的中间插入了jal函数。一般来说,GCD到下一行始终是错误的。

所以你应该将{{1}}的定义移到其他地方,并考虑从这个函数返回后你想要运行的是什么。