GCD mips程序启动无限循环

时间:2014-02-08 01:23:31

标签: mips greatest-common-divisor

我相信我的筹码存在问题。我一步一步地跑了几次,每次到达这一部分它都会正常工作,直到找到数字不等于零的分支继续“重复”,但它只会跳回“GCD”而不做任何改动在堆栈或参数中,从而启动无限循环。 我尝试在第一个“jal GCD”前面放一个“#”,但是程序会在达到“lw $ a2,8($ s1)”之后停止并给我一个例外。我能做什么才能使商替换参数2并继续搜索GCD?

GCD: 
addi $sp, $sp, -16  #   
sw $ra, 0($sp)      #set stack
sw $s0, 4($sp)      #
sw $a1, 8($sp)      #
sw $a2, 12($sp)     #

div $a1, $a2        #n1/n2
mfhi $s1
bnez $s1, repeat    #repeat until equals 0

addi $v0, $a2, 0
addi $sp, $sp, 16

jr $ra          #return gcd

repeat:
jal GCD
lw $a1, 4($sp)
lw $a2, 8($s1)
jal GCD
lw $a1, 4($sp)
lw $a2, 8($sp)
jr $ra

2 个答案:

答案 0 :(得分:0)

从我记得的GCD,对于每一步,如果零没有发生,程序应该将$ a2移动到$ a1,然后将除数的余数移到$ a2,然后循环回div指令,而不是回到GCD。

答案 1 :(得分:0)

这是一个用于查找两个数字的 GCD 的 mips 代码。

.data
num1:.asciiz"Enter the first value:"
num2: .asciiz"Enter the second value:"

.text
.globl main
main:
    li $v0,4
    la $a0,num1
    syscall
    
    li  $v0, 5      #User Input for num1
    syscall
    move $t0,$v0 #Storing user input in another register since $a0 will be occupied in the next command
  
    li $v0,4
    la $a0,num2
    syscall

    li  $v0, 5      #User input for num2
    syscall
    move $a1,$v0
    move $a0,$t0    #Transfering the user input for num1 in $a0

    jal GCD #Calling GCD func

    add $a0,$v0,$zero 
    li $v0,1
    syscall # print result
    li $v0, 10 # exit the program
    syscall
    
GCD:
    #GCD(num1, num2)
    # num1 = $a0
    # num2 = $a1

    addi $sp, $sp, -12
    sw $ra, 0($sp) # Func stored in stack
    sw $s0, 4($sp) # Value stored in stack
    sw $s1, 8($sp) # Value stored in stack

    add $s0, $a0, $zero # s0 = a0 ( value num1 ) 
    add $s1, $a1, $zero # s1 = a1 ( value num2 ) 

    addi $t1, $zero, 0 # $t1 = 0
    beq $s1, $t1, return # if s1 == 0 return

    add $a0, $zero, $s1 # make a0 = $s1
    div $s0, $s1 # num1/num2
    mfhi $a1 # reminder of num1/num2 = to num1%num2

    jal GCD
    
exitGCD:
    lw $ra, 0 ($sp)  # read registers from stack
    lw $s0, 4 ($sp)
    lw $s1, 8 ($sp)
    addi $sp,$sp , 12 # bring back stack pointer
    jr $ra
return:
    add $v0, $zero, $s0 # return $v0 = $s0 ( num1)
    j exitGCD