# C code: # main() { # print_str("The answer is: "); # print_int(fact(10)); # } # # int fact(int n) { # if (n <= 1) # return 1; # else # return (n * fact(n-1)); # } # # Conditional branches: # main() { # print_str("The answer is: "); # int n = fact(10); # print_int(n); # } # # int fact(int n) { # if (n > 0) goto recurse # v = 1 # goto done # recurse: # n1 = n - 1 # f = fact(n1) # v = n * f # done: # return v # } .data msg: .asciiz "The answer is: " .text .globl main main: # BEGIN main prologue subu $sp,$sp, 24 # Allocate stack frame sw $fp, 0($sp) # Save $fp in frame addu $fp, $sp, 24 # Set up $fp sw $ra, -20($fp) # Save $ra # END main prologue la $a0, msg # Arg 0 = msg li $v0, 4 # print_str syscall # BEGIN CALL fact(10) li $a0, 10 # Arg 0 = 10 jal fact move $a0, $v0 # Arg 0 = result # END CALL fact(10) li $v0, 1 # print_int syscall # BEGIN main epilogue lw $ra, -20($fp) # Restore $ra lw $fp, -24($fp) # Restore $fp addu $sp, $sp, 24 # Pop stack frame jr $ra # END main epilogue fact: # BEGIN fact prologue subu $sp, $sp, 24 # Allocate stack frame sw $fp, 0($sp) # Save $fp addu $fp, $sp, 24 # Set up $fp sw $ra, -20($fp) # Save return address sw $a0, -16($fp) # Save arg 0 (n) # END fact prologue bgtz $a0, recurse # if (n <= 0) then li $v0, 1 # return 1 b done # else recurse: # BEGIN CALL fact(n-1) subu $a0, $a0, 1 # n = n - 1 jal fact # fact(n-1) # END CALL fact(n-1) lw $t0, -16($fp) # load n mul $v0, $v0, $t0 # compute fact(n-1)*n done: # BEGIN fact epilogue lw $ra, -20($fp) # restore $ra lw $fp, -24($fp) # restore $fp addu $sp, $sp, 24 # pop stack frame jr $ra # END fact epilogue