li $a0, 68 li $v0, 9 syscall or $fp, $0, $v0 la $t0, main sw $t0, 0($fp) sw $0, 4($fp) la $ra, done j main #func inner_fact inner_fact: sw $ra, 64($fp) #param n or $16, $0, $5 #param a or $17, $0, $6 #if n != 0 then L0 bne $16, $0, L0 #ret a or $v1, $0, $17 jr $31 #L0 L0: #$t1 := n - 1 li $9, 1 sub $8, $16, $9 #$t2 := a * n mult $17, $16 mflo $10 #arg $t1 or $5, $0, $8 #arg $t2 or $6, $0, $10 #call inner_fact, $t0 li $a0, 68 li $v0, 9 syscall sw $fp, 4($v0) sw $16, 8($fp) sw $17, 12($fp) or $fp, $0, $v0 la $t0, inner_fact sw $t0, 0($fp) jal inner_fact lw $fp, 4($fp) lw $ra, 64($fp) lw $16, 8($fp) lw $17, 12($fp) or $11, $0, $v1 #ret $t0 or $v1, $0, $11 jr $31 #end inner_fact #func fact fact: sw $ra, 64($fp) #param n or $16, $0, $5 #arg n or $5, $0, $16 #arg 1 li $12, 1 or $6, $0, $12 #call inner_fact, $t3 li $a0, 68 li $v0, 9 syscall sw $fp, 4($v0) sw $16, 8($fp) or $fp, $0, $v0 la $t0, inner_fact sw $t0, 0($fp) jal inner_fact lw $fp, 4($fp) lw $ra, 64($fp) lw $16, 8($fp) or $13, $0, $v1 #ret $t3 or $v1, $0, $13 jr $31 #end fact #func main main: sw $ra, 64($fp) #arg 3 li $14, 3 or $5, $0, $14 #call fact, $t4 li $a0, 68 li $v0, 9 syscall sw $fp, 4($v0) or $fp, $0, $v0 la $t0, fact sw $t0, 0($fp) jal fact lw $fp, 4($fp) lw $ra, 64($fp) or $15, $0, $v1 #x := $t4 or $16, $0, $15 #arg 5 li $24, 5 or $5, $0, $24 #call fact, $t5 li $a0, 68 li $v0, 9 syscall sw $fp, 4($v0) sw $16, 8($fp) or $fp, $0, $v0 la $t0, fact sw $t0, 0($fp) jal fact lw $fp, 4($fp) lw $ra, 64($fp) lw $16, 8($fp) or $25, $0, $v1 #y := $t5 or $17, $0, $25 #arg 7 li $8, 7 or $5, $0, $8 #call fact, $t6 li $a0, 68 li $v0, 9 syscall sw $fp, 4($v0) sw $16, 8($fp) sw $17, 12($fp) or $fp, $0, $v0 la $t0, fact sw $t0, 0($fp) jal fact lw $fp, 4($fp) lw $ra, 64($fp) lw $16, 8($fp) lw $17, 12($fp) or $9, $0, $v1 #z := $t6 or $18, $0, $9 #$t8 := x + y add $10, $16, $17 #$t7 := $t8 + z add $11, $10, $18 #ret $t7 or $v1, $0, $11 jr $31 #end main done: ori $v0, $0, 10 syscall