# # program to compute GCD using recursive version of Euclid's # algorithm. # .text .globl main main: # # opening linkage (save return address) # addi $sp, $sp, -4 sw $ra, 0($sp) # # register usage: # $s0 a # $s1 b # # # prompt and get inputs # la $a0, prompt li $v0, 4 # "print string" syscall syscall li $v0, 5 # "read int" syscall syscall addi $s0, $v0, 0 # save result li $v0, 5 # "read int" syscall syscall addi $s1, $v0, 0 # save result # # check for both 0 (error) # # C code: # if ((a == 0) && (b == 0)) { # printf("Cannot both be 0\n"); # /* exit program */ # } # C with goto: # if (a != 0) goto continue bne $s0, $zero, continue # if (b != 0) goto continue bne $s1, $zero, continue # printf("Cannot both be 0\n"); la $a0, error li $v0, 4 # "print string" syscall syscall # /* exit */ j end continue: # # echo inputs # la $a0, entered li $v0, 4 # "print string" syscall syscall addi $a0, $s0, 0 li $v0, 1 # "print int" syscall syscall la $a0, nl li $v0, 4 # "print string" syscall syscall addi $a0, $s1, 0 li $v0, 1 # "print int" syscall syscall la $a0, nl li $v0, 4 # "print string" syscall syscall # # call function and print result # # print header la $a0, result li $v0, 4 # "print string" syscall syscall # compute result and print addi $a0, $s0, 0 # first argument a addi $a1, $s1, 0 # second argument b jal gcd addi $a0, $v0, 0 li $v0, 1 # "print int" syscall syscall la $a0, nl li $v0, 4 # "print string" syscall syscall # # closing linkage (get return address and restore stack pointer) # end: lw $ra, 0($sp) addi $sp, $sp, 4 jr $ra .end main # # function # gcd: # opening linkage addi $sp, $sp, -4 sw $ra, 0($sp) # # register usage: # # $a0 a # $a1 b # # C code: # int gcd(int a, int b) { # if (b == 0) { # return a; # } # else { # return gcd(b, a%b); # } # # C code with goto: # int gcd(int a, int b) { # if (b != 0) goto gcd_notbase bne $a1, $zero, gcd_notbase # return a; addi $v0, $a0, 0 # goto gcd_end j gcd_end gcd_notbase: # return gcd(b, a%b); rem $t0, $a0, $a1 # $t0 <- a % b addi $a0, $a1, 0 # $a0 <-b addi $a1, $t0, 0 jal gcd gcd_end: # # closing linkage lw $ra, 0($sp) addi $sp, $sp, 4 jr $ra # # area for variables and constants # .data prompt: .asciiz "Enter integers for a and b, one per line:\n" error: .asciiz "Cannot both be 0\n" entered:.asciiz "\nYou entered:\n" result: .asciiz "\nGCD of a and b:\n" nl: .asciiz "\n"