Advertisement
Guest User

Untitled

a guest
May 28th, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.77 KB | None | 0 0
  1. #================================================================================================
  2. # Nie można zmieniać mojego kodu.
  3. # Wasz kod powinien się pojawić tylko w przeznaczonych do tego miejscach.
  4. # Skrót # ... oznacza, że w tym miejscu mogę dopisać dowolne rozkazy i pseudorozkazy
  5. # Podstawowym zagadnieniem dzisiejszych zajęć jest wywoływanie podprogramów (procedur).
  6. #================================================================================================
  7. .data
  8. nl: .asciiz "\n"
  9. UBAW: .asciiz "\nZaczynamy rock-and-roll !\n"
  10. THATALL: .asciiz "\n\nThat's all folks!\n"
  11. NCLASSES: .asciiz "\nChociaz z przyjemnoscia spotkamy sie na nastepnych zajeciach."
  12. INTRO: .ascii "\nProsze wprowadzic\n"
  13. .asciiz "Lancuch do bufora BUFOREK: "
  14. INTRO1: .ascii "\nProsze wprowadzic\n"
  15. .asciiz "Lancuch do bufora SPACE: "
  16. Len: .asciiz "\nDlugosc stringa BUFOREK jest równa - "
  17. rev: .asciiz "To jest revers stringa w BUFOREK - "
  18. sdigit: .asciiz "\nSuma wszystkich cyferek w buforze BUFOREK jest rowna - "
  19. .align 2
  20. BUFOREK: .space 256
  21. SPACE: .space 256
  22. .text
  23. #===============================================================
  24. # Oblicz sumę wszystkich cyfr występujących we wprowadzonym przez
  25. # użytkownika łańcuchu BUFOREK.
  26. # Podprogram spodziewa się długości łańcucha w $a0.
  27. # Suma ma być zwrócona w $v0.
  28. #===============================================================
  29. summation:
  30. #------ początek Waszej sekwencji rozkazów ---------------------
  31. # Pamiętaj o skomentowaniu każdej linii poniższego kodu!
  32. sw $ra, 0($sp)
  33. addi $sp, $sp, -4
  34. # ...
  35. # (nie wolno kasować tej linii) Tutaj oblicz sumę cyferek występujących w stringu
  36. # ...
  37.  
  38. li $v0, 0
  39. li $s1, 0
  40.  
  41. DigitSumLoop:
  42. lb $t0, BUFOREK($s1)
  43. addi $s1, $s1, 1
  44. blt $t0, 58, isDigit
  45. ble $s1, $a0, DigitSumLoop
  46.  
  47. j DigitSumLoopEnd
  48.  
  49. isDigit:
  50. bgt $t0, 47, yesIsDigit
  51. j DigitSumLoop
  52.  
  53. yesIsDigit:
  54. addi $t0, $t0, -48
  55. add $v0, $v0, $t0
  56. j DigitSumLoop
  57.  
  58. DigitSumLoopEnd:
  59. li $s1, 0 #resetuje licznik s1
  60. addi $sp, $sp, 4
  61. lw $ra, 0($sp)
  62. #------ end of your sequence of instructions -------------------
  63. jr $ra # rozkaz należy wykorzystać (musi się wykonać)
  64. #===============================================================
  65. # Podprogram DetermineLength powinien obliczyć długość stringa
  66. # wprowadzonego do BUFOREK przez użytkownika.
  67. # Podprogram powinien zwrócić długość w rejestrze $v0.
  68. #===============================================================
  69. DetermineLength:
  70. #------ początek Waszej sekwencji rozkazów ---------------------
  71. # Pamiętaj o skomentowaniu każdej linii poniższego kodu!
  72. #
  73. # ...
  74. # (nie wolno kasować tej linii) Oblicz długość stringa w BUFOREK
  75. sw $ra, 0($sp)
  76. addi $sp, $sp, -4
  77.  
  78. li $s0, 0
  79.  
  80. DetermineLengthLoop:
  81. addi $s0, $s0, 1
  82. lb $t0, BUFOREK($s0)
  83. bgt $t0, 1, DetermineLengthLoop
  84. subi $s0, $s0, 1 #odejmujemy 1 od policzonej liczby zeby nie liczyc entera
  85.  
  86. move $a0, $s0
  87. # ...
  88. # (nie wolno kasować tej linii) wywołaj procedure summation (zwraca sume w rejestrze $v0)
  89. jal summation
  90. move $t2, $v0
  91. # ...
  92. # (nie wolno kasować tej linii) wyświetl komunikat sdigit wraz z wyświetleniem sumy cyferek
  93.  
  94. li $v0, 4
  95. la $a0, sdigit
  96. syscall
  97.  
  98. li $v0, 1
  99. move $a0, $t2
  100. syscall
  101.  
  102. addi $sp, $sp, 4
  103. lw $ra, 0($sp)
  104. # ...
  105. #------ tutaj kończy się Wasz kod ------------------------------
  106. jr $ra
  107. #===============================================================
  108. # Procedura revers powinna wyświetlić wszystkie znaki z bufora BUFOREK
  109. # Długość powinna być w rejestrze $a0
  110. # POCZYNAJĄC od ostatniego (czyli należy wyświetlić string w odwrotnej kolejności).
  111. #===============================================================
  112. reverse:
  113. #------ początek Waszej sekwencji rozkazów ---------------------
  114. # Pamiętaj o skomentowaniu każdej linii poniższego kodu!
  115.  
  116. sw $ra, 0($sp)
  117. addi $sp, $sp, -4
  118.  
  119. move $s1, $a0 #ładujemy licbe znaków do licznika s1
  120.  
  121. li $v0, 11
  122. reverseLoop:
  123. subi $s1, $s1, 1
  124. lb $a0, BUFOREK($s1)
  125. syscall
  126. bge $s1, 0, reverseLoop
  127.  
  128. addi $sp, $sp, 4
  129. lw $ra, 0($sp)
  130. #
  131. #------ tutaj kończy się Wasz kod ------------------------------
  132. jr $ra
  133. .globl main
  134. main: jal sub0 # wywołanie podprogramu sub0
  135. #------ początek Waszej sekwencji rozkazów ---------------------
  136. # Pamiętaj o skomentowaniu każdej linii poniższego kodu!
  137. #
  138. # ...
  139. # (nie wolno kasować tej linii) wywołaj procedurę DetermineLength
  140. jal DetermineLength
  141. # ...
  142. # (nie wolno kasować tej linii) Wyświetl komunikat spod etykiety Len:
  143. # (nie wolno kasować tej linii) Pamiętaj o skomentowaniu każdej linii poniższego kodu!
  144. li $v0, 4
  145. la $a0, Len
  146. syscall
  147.  
  148. # ...
  149. # (nie wolno kasować tej linii) Wyświetl długość stringa wprowadzonego do BUFOREK.
  150. # (nie wolno kasować tej linii) Po jego wyswietleniu wyprowadź nową linię.
  151.  
  152. li $v0, 1
  153. move $a0, $s0
  154. syscall
  155.  
  156. # ...
  157. # (nie wolno kasować tej linii) Wyświetl komunikat spod etykiety rev:
  158.  
  159.  
  160. li $v0, 4
  161. la $a0, nl
  162. syscall
  163. la $a0, rev
  164. syscall
  165.  
  166. move $a0, $s0 #przenosimy do a0 dlugosc stringa buforek
  167. # ...
  168. # (nie wolno kasować tej linii) wywołaj procedure reverse
  169. jal reverse
  170. # ...
  171. # (nie wolno kasować tej linii) Wyświelt stringa spod etykiety THATALL
  172.  
  173. li $v0, 4
  174. la $a0, THATALL
  175. syscall
  176. # ...
  177. #------ tutaj kończy się Wasz kod ------------------------------
  178. end: li $v0, 10 # terminate execution
  179. syscall
  180. #------------------------------------------------------------------------
  181. # Podprogram Sub0 powinien wyświetlić komunikat spod etykiety UBAW, i zaraz
  182. # po tym wywołać podprogram sub1.
  183. #------------------------------------------------------------------------
  184. sub0:
  185. #------ początek Waszej sekwencji rozkazów ---------------------
  186. # Pamiętaj o skomentowaniu każdej linii poniższego kodu!
  187.  
  188. sw $ra, 0($sp)
  189. addi $sp, $sp, -4
  190.  
  191. # ...
  192. # (nie wolno kasować tej linii) Tutaj wyświetl komunikat UBAW
  193.  
  194. li $v0, 4
  195. la $a0, UBAW
  196. syscall
  197.  
  198.  
  199. # ...
  200. # (nie wolno kasować tej linii) wywołaj podprogram sub1
  201. jal sub1
  202. # ...
  203. # (nie wolno kasować tej linii) Wyświetl komunikat NCLASSES
  204. li $v0, 4
  205. la $a0, NCLASSES
  206. syscall
  207.  
  208. addi $sp, $sp, 4
  209. lw $ra, 0($sp)
  210.  
  211. # ...
  212. #------ tutaj kończy się Wasz kod ------------------------------
  213. jr $ra # należy wykonać ten rozkaz (wrócić do następnego rozkazu po jal sub0)
  214. #-----------------------------------------------------------------------------
  215. # Procedura sub1 powinna wyświetlić komunikat INTRO i zaraz po tym
  216. # powinna wywołać podprogram sub2, który wypełnia BUFOREK łańcuchem wprowadzonym
  217. # przez użytkownika.
  218. # Następnie podprogram sub1 powinien wyswietlić także komunikat INTRO1 wypełnić
  219. # bufor SPACE stringiem użytkownika wywołując sub2.
  220. #-----------------------------------------------------------------------------
  221. sub1:
  222. #------ początek Waszej sekwencji rozkazów ---------------------
  223. # Pamiętaj o skomentowaniu każdej linii poniższego kodu!
  224. sw $ra, 0($sp)
  225. addi $sp, $sp, -4
  226. # ...
  227. # (nie wolno kasować tej linii) Wyświelt stringa spod etykiety INTRO
  228. li $v0, 4
  229. la $a0, INTRO
  230. syscall
  231. # ...
  232. # (nie wolno kasować tej linii) Wywołaj sub2 aby wypełnić bufor BUFOREK
  233. la $a0, BUFOREK
  234. jal sub2
  235.  
  236. # ...
  237. # (nie wolno kasować tej linii) Wyświelt stringa spod etykiety INTRO1
  238. li $v0, 4
  239. la $a0, INTRO1
  240. syscall
  241. # ...
  242. # (nie wolno kasować tej linii) Wywołaj sub2 aby wypełnić bufor SPACE
  243. # (nie wolno kasować tej linii) Uwaga: Nic nie robimy z łańcuchem wprowadzonym do SPACE (fajnie?)
  244.  
  245. la $a0, SPACE
  246. jal sub2
  247.  
  248. addi $sp, $sp, 4
  249. lw $ra, 0($sp)
  250. #------ tutaj kończy się Wasz kod ------------------------------
  251. jr $ra # należy wykonać ten rozkaz (wrócić do następnego rozkazu po jal sub1)
  252.  
  253. #----- O jeju! podprogram gotowy do wykorzystania? Nie zupełnie! -----
  254. sub2:
  255. li $v0, 8
  256. li $a1, 256 # rozmiar bufora
  257. syscall
  258. jr $ra
  259. #--------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement