# A live coding example done as a recap on functions. # This has a recursive function main: # Frame: [$ra, $s0] # Uses: [$ra, $a0, $v0, $s0, $t0] # Clobbers: [$a0, $v0, $t0] # # Locals: # - $s0: int max # - $t0: int result # - $t1: temp memory calculations # Structure: # main # -> [prologue] # -> body # -> [epilogue] main__prologue: begin push $ra push $s0 main__body: li $s0, 10 # int max = 10; move $a0, $s0 # int max = 10; jal sum_to # result = sum_to(max); move $t0, $v0 # $t0 = result li $v0, 4 # printf("Sum 1.. "); la $a0, msg_sum1 syscall li $v0, 1 # printf("%d",max); move $a0, $s0 syscall li $v0, 4 # printf(" = "); la $a0, msg_sum2 syscall li $v0, 1 # printf("%d", result); move $a0, $t0 syscall li $v0, 11 # putchar('\n') li $a0, '\n' syscall li $v0, 0 main__epilog: pop $s0 pop $ra end jr $ra sum_to: # Frame: [$ra, $s0] # Uses: [$ra, $a0, $v0, $s0] # Clobbers: [$a0, $v0] # # Locals: # - $s0: int n # # Structure: # sum_to # -> [prologue] # -> body # -> if # -> else # -> if_end # -> [epilogue] sum_to__prologue: begin push $ra push $s0 sum_to__body: move $s0, $a0 sum_to__if: bnez $s0, sum_to__else # if(n == 0) li $v0, 0 # return 0 j sum_to__epilog sum_to__else: sub $a0, $s0, 1 # n - 1 jal sum_to # int result = sum_to(n-1); add $v0, $v0, $s0 # return result + n sum_to__if_end: sum_to__epilog: pop $s0 pop $ra end jr $ra .data msg_sum1: .asciiz "Sum 1.. " msg_sum2: .asciiz " = " .text