Year 2 compilers coureswork

recurse.asm 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. li $a0, 68
  2. li $v0, 9
  3. syscall
  4. or $fp, $0, $v0
  5. la $t0, main
  6. sw $t0, 0($fp)
  7. sw $0, 4($fp)
  8. la $ra, done
  9. j main
  10. #func inner_fact
  11. inner_fact:
  12. sw $ra, 64($fp)
  13. #param n
  14. or $16, $0, $5
  15. #param a
  16. or $17, $0, $6
  17. #if n != 0 then L0
  18. bne $16, $0, L0
  19. #ret a
  20. or $v1, $0, $17
  21. jr $31
  22. #L0
  23. L0:
  24. #$t1 := n - 1
  25. li $9, 1
  26. sub $8, $16, $9
  27. #$t2 := a * n
  28. mult $17, $16
  29. mflo $10
  30. #arg $t1
  31. or $5, $0, $8
  32. #arg $t2
  33. or $6, $0, $10
  34. #call inner_fact, $t0
  35. li $a0, 68
  36. li $v0, 9
  37. syscall
  38. sw $fp, 4($v0)
  39. sw $16, 8($fp)
  40. sw $17, 12($fp)
  41. or $fp, $0, $v0
  42. la $t0, inner_fact
  43. sw $t0, 0($fp)
  44. jal inner_fact
  45. lw $fp, 4($fp)
  46. lw $ra, 64($fp)
  47. lw $16, 8($fp)
  48. lw $17, 12($fp)
  49. or $11, $0, $v1
  50. #ret $t0
  51. or $v1, $0, $11
  52. jr $31
  53. #end inner_fact
  54. #func fact
  55. fact:
  56. sw $ra, 64($fp)
  57. #param n
  58. or $16, $0, $5
  59. #arg n
  60. or $5, $0, $16
  61. #arg 1
  62. li $12, 1
  63. or $6, $0, $12
  64. #call inner_fact, $t3
  65. li $a0, 68
  66. li $v0, 9
  67. syscall
  68. sw $fp, 4($v0)
  69. sw $16, 8($fp)
  70. or $fp, $0, $v0
  71. la $t0, inner_fact
  72. sw $t0, 0($fp)
  73. jal inner_fact
  74. lw $fp, 4($fp)
  75. lw $ra, 64($fp)
  76. lw $16, 8($fp)
  77. or $13, $0, $v1
  78. #ret $t3
  79. or $v1, $0, $13
  80. jr $31
  81. #end fact
  82. #func main
  83. main:
  84. sw $ra, 64($fp)
  85. #arg 3
  86. li $14, 3
  87. or $5, $0, $14
  88. #call fact, $t4
  89. li $a0, 68
  90. li $v0, 9
  91. syscall
  92. sw $fp, 4($v0)
  93. or $fp, $0, $v0
  94. la $t0, fact
  95. sw $t0, 0($fp)
  96. jal fact
  97. lw $fp, 4($fp)
  98. lw $ra, 64($fp)
  99. or $15, $0, $v1
  100. #x := $t4
  101. or $16, $0, $15
  102. #arg 5
  103. li $24, 5
  104. or $5, $0, $24
  105. #call fact, $t5
  106. li $a0, 68
  107. li $v0, 9
  108. syscall
  109. sw $fp, 4($v0)
  110. sw $16, 8($fp)
  111. or $fp, $0, $v0
  112. la $t0, fact
  113. sw $t0, 0($fp)
  114. jal fact
  115. lw $fp, 4($fp)
  116. lw $ra, 64($fp)
  117. lw $16, 8($fp)
  118. or $25, $0, $v1
  119. #y := $t5
  120. or $17, $0, $25
  121. #arg 7
  122. li $8, 7
  123. or $5, $0, $8
  124. #call fact, $t6
  125. li $a0, 68
  126. li $v0, 9
  127. syscall
  128. sw $fp, 4($v0)
  129. sw $16, 8($fp)
  130. sw $17, 12($fp)
  131. or $fp, $0, $v0
  132. la $t0, fact
  133. sw $t0, 0($fp)
  134. jal fact
  135. lw $fp, 4($fp)
  136. lw $ra, 64($fp)
  137. lw $16, 8($fp)
  138. lw $17, 12($fp)
  139. or $9, $0, $v1
  140. #z := $t6
  141. or $18, $0, $9
  142. #$t8 := x + y
  143. add $10, $16, $17
  144. #$t7 := $t8 + z
  145. add $11, $10, $18
  146. #ret $t7
  147. or $v1, $0, $11
  148. jr $31
  149. #end main
  150. done:
  151. ori $v0, $0, 10
  152. syscall