# abcd.s -- a modular program in MIPS assembly (does the same thing # as the C++ version abcd.C # It would have been nice to name the procedures by single letters # a, b, c and d, but unfortunately "b" is a reserved word. .data str_a: .asciiz "a" str_b: .asciiz "b" str_c: .asciiz "c" str_d: .asciiz "d" newline: .asciiz "\n" .text main: jal proc_a # call procedure proc_a li $v0, 4 # print newline la $a0, newline syscall jal proc_b # call procedure proc_b li $v0, 4 # print newline la $a0, newline syscall jal proc_c # call procedure proc_c li $v0, 4 # print newline la $a0, newline syscall jal proc_d # call procedure proc_d li $v0, 4 # print newline la $a0, newline syscall li $v0, 10 # We're done! syscall #------------------------------------------------------------------- proc_a: li $v0, 4 # print the letter a la $a0, str_a syscall jr $ra # return from procedure #------------------------------------------------------------------- proc_b: sw $ra, 0($sp) # save return address addi $sp, $sp, -4 jal proc_a # call proc_a li $v0, 4 # print the letter b la $a0, str_b syscall addi $sp, $sp, 4 # restore return address lw $ra, 0($sp) jr $ra # return from procedure #------------------------------------------------------------------- proc_c: sw $ra, 0($sp) # save return address addi $sp, $sp, -4 jal proc_a # call proc_a jal proc_b # call proc_b li $v0, 4 # print the letter c la $a0, str_c syscall addi $sp, $sp, 4 # restore return address lw $ra, 0($sp) jr $ra # return from procedure #------------------------------------------------------------------- proc_d: sw $ra, 0($sp) # save return address addi $sp, $sp, -4 jal proc_a # call proc_a jal proc_b # call proc_b jal proc_c # call proc_c li $v0, 4 # print the letter d la $a0, str_d syscall addi $sp, $sp, 4 # restore return address lw $ra, 0($sp) jr $ra # return from procedure