main: # Args: void # Returns: # - int # # Locals: # - $s0: int input # - $t0: int f # # Stack: [$ra, $s0] # Uses: [$s0, $a0, $v0, $t0] # Clobbers: [$t0, $a0, $v0] # # Structure: # -> main # -> [prologue] # -> [body] # -> [epilogue] main__prologue: begin push $ra push $s0 main__body: li $v0, 5 # syscall 5: read_int syscall # move $s0, $v0 # scanf("%d", &input); # TODO: call factorial, and put the result somewhere useful move $a0, $s0 # jal factorial # move $t0, $v0 # int f = factorial(input); li $v0, 1 # syscall 1: print_int move $a0, $s0 # syscall # printf("%d", input); li $v0, 4 # syscall 4: print_string la $a0, main__result_msg # syscall # printf("!= "); li $v0, 1 # syscall 1: print_int move $a0, $t0 # syscall # printf("%d", f); li $v0, 11 # syscall 11: print_char li $a0, '\n' # syscall # putchar('\n'); main__epilogue: pop $s0 pop $ra end li $v0, 0 # jr $ra # return 0; factorial: # Args: # - $a0: int n # Returns: # - int # # Locals: # - $s0: int n # # Stack: [$ra, $s0] # Uses: [$s0, $a0, $v0] # Clobbers: [$a0, $v0] # # Structure: # -> factorial # -> [prologue] # -> [body] # -> read_loop # -> init # -> cond # -> body # -> n_le_0 # -> [epilogue] factorial__prologue: begin push $ra push $s0 factorial__body: move $s0, $a0 blez $a0, factorial__n_le_0 addi $a0, $s0, -1 jal factorial mul $v0, $s0, $v0 # retval = n * factorial(n - 1) j factorial__epilogue factorial__read_loop_init: factorial__read_loop_cond: factorial__read_loop_body: factorial__read_loop_step: factorial__read_loop_end: factorial__n_le_0: li $v0, 1 # retval = 1 factorial__epilogue: pop $s0 pop $ra end jr $ra .data main__result_msg: .asciiz "! = "