--C COMPILER int inner_fact(int n, int a) { if (n==0) { return a; } return inner_fact(n-1,a*n); } int fact(int n) { return inner_fact(n,1); } int main(){ return fact(6); } parse finished ~ ~ D d int F inner_fact , ~ int n ~ int a ; if == n 0 return a return apply inner_fact , - n 1 * a n D d int F fact ~ int n return apply inner_fact , n 1 D d int F main return apply fact 6 func inner_fact param n param a if n != 0 then L0 ret a L0 $t1 := n - 1 $t2 := a * n arg $t1 arg $t2 call inner_fact, $t0 ret $t0 end inner_fact func fact param n arg n arg 1 call inner_fact, $t3 ret $t3 end fact func main arg 6 call fact, $t4 ret $t4 end main ===== li $a0, 68 li $v0, 9 syscall or $fp, $0, $v0 la $t0, main sw $t0, 0($fp) sw $0, 4($fp) jal main j done #func inner_fact inner_fact: li $a0, 68 li $v0, 9 syscall sw $fp, 4($v0) or $fp, $0, $v0 la $t0, inner_fact sw $t0, 0($fp) 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 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: li $a0, 68 li $v0, 9 syscall sw $fp, 4($v0) or $fp, $0, $v0 la $t0, fact sw $t0, 0($fp) 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 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: li $a0, 68 li $v0, 9 syscall sw $fp, 4($v0) or $fp, $0, $v0 la $t0, main sw $t0, 0($fp) sw $ra, 64($fp) #arg 6 li $14, 6 or $5, $0, $14 #call fact, $t4 jal fact lw $fp, 4($fp) lw $ra, 64($fp) or $15, $0, $v1 #ret $t4 or $v1, $0, $15 jr $31 #end main done: ori $v0, $0, 10 syscall