# A live coding example done on functions. # This has a simple function with 1 parameter and a return value PRINT_INT = 1 PRINT_STR = 4 PRINT_CHAR = 11 #include #int sum_to(int n); #int main(void) { # int max = 10; # int result = sum_to(max); # printf("Sum 1.. "); # printf("%d", max); # printf(" = "); # printf("%d", result); # putchar('\n'); # return 0; #} #// An iterative solution #int sum_to(int n) { #sum_to_loop_init: # int sum = 0; # int i = 1; #sum_to_loop_cond: # if (i > n) goto sum_to_loop_end; //while (i <= n) { #sum_to_loop_body: # sum = sum + i; #sum_to_loop_inc: # i = i + 1; # goto sum_to_loop_cond; #sum_to_loop_end: # return sum; #} .text main: #Local max $s0 #Local result $t0 main__prologue: #TODO main__body: li $s0, 10 # int max = 10 li $v0, PRINT_STR la $a0, msg_sum1 #printf("Sum 1.. "); syscall li $v0, PRINT_INT move $a0, $s0 #printf("%d", max); syscall li $v0, PRINT_STR la $a0, msg_sum2 #printf(" = "); syscall #TODO #printf("%d", result); # pass max to function and prepare to receive the return value li $v0, PRINT_CHAR #putchar('\n'); li $a0, '\n' syscall li $v0, 0 main__epilogue: #TODO jr $ra ################################################ # leaf function does not need prologue/epilogue and push/pop sum_to: #Local sum $t0 #Local i $t1 sum_to_loop_init: li $t0, 0 li $t1, 1 sum_to_loop_cond: #TODO sum_to_loop_body: add $t0, $t0, $t1 sum_to_loop_inc: add $t1, $t1, 1 b sum_to_loop_cond sum_to_loop_end: #TODO - return $t0 jr $ra .data msg_sum1: .asciiz "Sum 1.. " msg_sum2: .asciiz " = "