# The main program for Lab 4.1, compute gcd(A,B), result is put back in # C. See Appendix A, page A45,A46 on how to use syscall instruction. # The syscall works only on xspim or spim, but not with cc. .data str1: .asciiz "gcd(" str2: .asciiz ", " str3: .asciiz ") = " str4: .asciiz "\n" A: .word 12 # change the value for A, B for other input B: .word 4 C: .word 0 .text .globl main main: addi $29, $29, -4 sw $31, 0($29) lw $4, A # load in values to registers lw $5, B jal gcd # call the function sw $2, C # printing out in a nice form is tedious with SPIM la $4, str1 li $2, 4 syscall lw $4, A li $2, 1 syscall la $4, str2 li $2, 4 syscall lw $4, B li $2, 1 syscall la $4, str3 li $2, 4 syscall lw $4, C li $2, 1 syscall la $4, str4 li $2, 4 syscall lw $31, 0($29) addi $29, $29, 4 j $31 # The MIPS assembly language procedure for the greatest common # divisor. $4 and $5 are the two arguments. # $4 contains the dividend, # $5 contains the divisor, # $3 contains the remainder. .text .globl gcd gcd: Loop: div $4, $5 # a/b, quotient in lo, remainder in hi mfhi $3 # remainder beq $3, $0, Exit # ended if r = 0 move $4, $5 # a = b, old divisor becomes the dividend move $5, $3 # b = r, remainder becomes the new divisor j Loop Exit: move $2, $5 # return divisor in $2 j $31