.data nl: .asciiz "\n" .text .globl main main: subu $sp, $sp, 24 sw $ra, 16($sp) li $a0, 10 # call fact with arg $a0 jal fact move $a0, $v0 # print_int $a0 li $v0, 1 syscall li $v0, 4 # print_string "\n" la $a0, nl syscall lw $ra, 16($sp) addiu $sp, $sp, 24 jr $ra fact: subu $sp, $sp, 32 sw $ra, 20($sp) sw $s0, 16($sp) # save local $s0 to avoid clobber move $s0, $a0 bgtz $s0, $L2 # goto $L2 if arg is > 0 li $v0, 1 # return 1 if arg is <= 0 jr $L1 $L2: subu $a0, $s0, 1 # new arg to fact is arg-1 jal fact mul $v0, $s0, $v0 # note that $s0 is saved and restored $L1: lw $ra, 20($sp) lw $s0, 16($sp) # restore $s0 addiu $sp, $sp, 32 jr $ra