| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- --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
|