我相信我的筹码存在问题。我一步一步地跑了几次,每次到达这一部分它都会正常工作,直到找到数字不等于零的分支继续“重复”,但它只会跳回“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
答案 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