fact: sub $sp, $sp, 8 # Make room for 2 items on stack sw $ra, 4( $sp ) # Return address sw $a0, 0( $sp ) # Input argument, saved for multiplication slt $t0, $a0, 1 # n < 1? beq $t0, $zero, L1 # Prepare to call function again add $v0, $zero, 1 # Return 1 add $sp, $sp, 8 # Pop two items; you don't restore them (why?) jr $ra # Return to caller L1: sub $a0, $a0, 1 # Perform recursion jal fact # Return point from recursion lw $a0, 0 ( $sp ) # Restore n to value before recursive call lw $ra, 4 ( $sp ) # Return address before recursive call add $sp, $sp, 8 # Restore stack pointer mul $v0, $a0, $v0 # return ( n * fact ( n - 1 ) ) jr $ra # Return to caller main: sub $sp, $sp, 4 sw $ra, 0($sp) add $a0, $zero, 5 jal fact lw $ra, 0($sp) add $sp, $sp, 4