# # simple program to compute gcd # .globl main .text main: # # opening linkage (save return address) # addi $sp,$sp,-4 sw $ra,0($sp) # # register usage # $s0 A # $s1 B # # get inputs # la $a0, promptA jal getint add $s0, $v0, $zero la $a0, promptB jal getint add $s1, $v0, $zero # # call gcd procedure # add $a0, $s0, $zero add $a1, $s1, $zero jal gcd # # print result # la $a0, result_msg add $a1, $v0, $zero jal printint # # closing linkage (get return address and restore stack pointer) # lw $ra,0($sp) addi $sp,$sp,4 jr $ra # # end of program # .end main # # area for variables and constants # .data promptA:.asciiz "Enter positive integer A: " promptB:.asciiz "Enter positive integer B: " result_msg: .asciiz "gcd(A, B) = " ### from file subs.s #### # # procedures for simple I/O # .globl printline .globl getint .globl printint .text ############################################################################ # # void printline(&string) prints string # at entry: # $a0 contains address of string to print (including newline) # printline: addi $sp,$sp,-4 sw $ra,0($sp) # $a0 contains &string li $v0, 4 # "print string" syscall syscall # return lw $ra,0($sp) addi $sp,$sp,4 jr $ra ############################################################################ # # int getint(&prompt_string) # at entry # $a0 contains address of prompt string # returns value in $v0 # getint: addi $sp,$sp,-4 sw $ra,0($sp) # $a0 contains &prompt li $v0, 4 # "print string" syscall syscall li $v0, 5 # "read int" syscall syscall # $v0 contains value # return lw $ra,0($sp) addi $sp,$sp,4 jr $ra ############################################################################ # # void printint(&ident_string, value) prints value with identifying string # and newline # at entry: # $a0 contains address of string to print first (no newline) # $a1 value to print # printint: addi $sp,$sp,-4 sw $ra,0($sp) # $a0 contains &ident_string li $v0, 4 # "print string" syscall syscall # $a1 contains value addu $a0, $a1, $zero li $v0, 1 # "print int" syscall syscall la $a0, nl li $v0, 4 syscall # return lw $ra,0($sp) addi $sp,$sp,4 jr $ra ### from file consts.s #### # # constants for use in several procedures # .globl nl .data nl: .asciiz "\n"