2014-03-02 34 views
0

我正在試圖用遞歸找到兩個數字的GCD。 這段代碼是我迄今爲止所做的,但顯然它進入了一個無限循環,我無法理解爲什麼以及如何解決這個問題。 我將不勝感激一些幫助MIPS中遞歸的兩個數字的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

在調試器中運行你的程序會給你一些關於它在哪裏以及爲什麼會卡住的提示。 – Michael

回答

2

所以你的程序在.text段的開頭開始執行,並繼續直行進入L標籤後的行jal GCD

下一個程序跳轉到GCD標籤在那裏執行,直到jr $ra這使得它返回到具有當然GCD的下一條指令的jal。這會導致無限循環。

所以這裏的問題是你已經在主函數的中間插入了GCD函數。一般來說,對於下一行,jal總是出錯。

所以你應該在其他地方移動GCD的定義,並考慮你想從這個函數返回後運行的是什麼。

+0

非常感謝。我還在函數調用之後和GCD標籤之前添加了一個跳轉,並在GCD函數之後放置它的標籤。這也起作用。 –

+0

好。如果它適合你,請接受答案。 :) –