Advertisement
Alhiris

Finished Mips Project

Nov 29th, 2019
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.06 KB | None | 0 0
  1. .data
  2. p: .space 4 #retinem valoarea p
  3. a: .space 4000 #Input maxim e 1000, ultimul prim posibil e 997
  4. mesajn: .space 1000
  5. mesajc: .space 1000
  6. alfabet:.asciiz "ABCDEFGHIJKLMNOPQRSTUVWXYZ *"
  7. newl: .asciiz "\n"
  8. fgen: .asciiz "Generatoul g este: "
  9. errPrime: .asciiz "P nu este un numar prim!"
  10. errGen: .asciiz "Eroare Generator(404)"
  11.  
  12. .text
  13. main:
  14. ######
  15. ##Rezolvare punctul a
  16. ######
  17.  
  18. li $v0,5 #Citire p
  19. syscall
  20. sw $v0,p #punem val citita in p
  21.  
  22. #Verificare p prim
  23. li $t0,2 #Punem in $t0 divizorul posibil al lui p
  24. mul $t1,$t0,$t0 #Folosim $t1 pentru conditie only, echivalentul cu i*i<=n (pentru eficienta)
  25. lw $t2,p #In $t2 il retinem pe p
  26.  
  27. Lprim:
  28. bgt $t1,$t2,findGen #Daca trece for-ul de divizibilitate, inseamna ca p e prim, deci cotinuam rezolvarea problemei
  29.  
  30. rem $t3,$t2,$t0 # $t3 = $t2 % $t0 (Restul impartirii la $t0, nu la $t1!!)
  31.  
  32. beq $t3,$0,notPrime # Daca $t3!=0 atunci p nu e prim, incheiem programul
  33.  
  34. addi $t0,$t0,1 # Adaugare 1 la indice
  35. mul $t1,$t0,$t0 # Facem update la "i*i"
  36. j Lprim
  37.  
  38. #Continuarea problemei => p e prim
  39. findGen:
  40. lw $t1,p #Retinerea lui p in $t1
  41. li $t0,2 #In $t0 retinem numarul generatorului, incepem de la 2
  42. beq $t1,$t0,assignGenException #In cazul ca p=2, vom folosi generatorul 1
  43.  
  44. Lgen:
  45. bge $t0,$t1,errGenNotFound #Nu e posibil sa ajunga in cazul errGenNotFound, daca input-ul e corect
  46.  
  47. li $t9,0 #$t9 reprezinta pozitia in vector(din 4 in 4)
  48. li $t8,0 #$t8 reprezinta indicele vectorului
  49.  
  50. Lvectgen:
  51. bge $t8,$t1,genCorect
  52.  
  53. li $t7,1 #Valoarea lui g mod p
  54. li $t6,1 #Puterea la care e ridicat g-ul ($t7)
  55.  
  56. ridPut:
  57. bgt $t6,$t8,verificUnic # Ridicam pana la puterea $t8(indicele elementului)
  58. mul $t7,$t7,$t0 # $t7 = ($t7 * g) % p
  59. rem $t7,$t7,$t1
  60.  
  61. addi $t6,$t6,1
  62.  
  63. j ridPut
  64.  
  65. verificUnic: #Verifica daca mai e un element egal in vector cu un for pana la ultimul element din vector
  66. #Incep de la pozitia 1 pentru ca g^0 va fi intotdeauna 1, si se poate demonstra ca in solutie
  67. #va mai exista un singur elem 1, doar in pozitia g^(p-1) cu ajutorul inversului modular, deoarece p e prim:
  68. # g^(p-2)=1(mod p)=> g^(p-1)%p=1 oricare ar fi g<p
  69. li $t5,4 #reprezinta pozitia pe memoria vect
  70. li $t4,1 #reprezinta indicele pe vect
  71.  
  72. loopVect: #Verificam fiecare element din vector daca e egal cu elementul pe care vrem sa il adaugam
  73. bge $t4,$t8,addInV #Daca ajungem la ultimul element din vector, elementul pe care il adaugam e unic, deci adaugam
  74. lw $t3,a($t5)
  75. beq $t7,$t3,genGresit #daca exista un element egal, gen e gresit si cautam alt generator
  76. addi $t5,$t5,4
  77. addi $t4,$t4,1
  78. j loopVect
  79.  
  80. addInV:
  81.  
  82. sw $t7,a($t9) #Adaugam in vector si marim indicele
  83. addi $t8,$t8,1
  84. addi $t9,$t9,4
  85. j Lvectgen
  86.  
  87. genGresit:
  88. addi $t0,$t0,1 #Trecem la uramtor generator
  89. j Lgen
  90.  
  91. #Am gasit generatorul, se afla in $t0
  92. genCorect:
  93.  
  94. la $a0,fgen #Afisare generator si afisare new line
  95. li $v0,4
  96. syscall
  97. move $a0,$t0
  98. li $v0,1
  99. syscall
  100. la $a0,newl
  101. li $v0,4
  102. syscall
  103.  
  104. ######
  105. ##Rezolvare punctul b
  106. ######
  107.  
  108. li $a1,1000 #Citire mesaj necriptat de lungime maxima 1000
  109. la $a0,mesajn
  110. li $v0,8
  111. syscall
  112.  
  113. li $t0,0 #indicele, care va reprenta lungimea sirului, in t1 se afla p
  114. li $t5,10 #String a0 citeste si enter-ul care e defapt un backspace?, 10 e codul ascii pentru backspace
  115.  
  116. #Incepem parcurgeream string-ului
  117. Lcript:
  118. lb $t2,mesajn($t0) #Load litera din mesajul necriptat
  119. li $t5,10 #Comparare cu backspace, poate doar in tio.run?
  120. beq $t2,$t5,doneCript #Terminarea mesajului necriptat
  121. li $t5,13 #Comparare cu carriage return(enter) (Nu e nevoie in cazul meu, dar poate pe un compiler e nevoie)
  122. beq $t2,$t5,doneCript #Terminarea mesajului necriptat
  123. li $t9,0 #indice in alfabet
  124. findInAlph:
  125. lb $t8,alfabet($t9) #Gasirea literei in alfabet
  126. beq $t2,$t8,afisCript #$t9 retine pozitia din alfabet al caracterului
  127. addi $t9,1
  128. j findInAlph
  129.  
  130. afisCript:
  131. mul $t9,$t9,4 #Schimbam $t9 pentru pozitia din vector de .word
  132. lw $t9,a($t9) #Obtinem pozitia din alfabet a literei criptate
  133. rem $t9,$t9,27 #Modulo 27 pentru a le mentine in alfabet(optimizare pentru p mai mare de 29)
  134. lb $a0,alfabet($t9) #Obtinerea literei si afisarea acesteia
  135. li $v0,11
  136. syscall
  137. addi $t0,1 #Urmatoarea litera din mesajul necriptat
  138. j Lcript
  139.  
  140. doneCript:
  141. la $a0,newl
  142. li $v0,4 #Print new line
  143. syscall
  144.  
  145. ######
  146. ##Rezolvare punctul c
  147. ######
  148.  
  149. li $a1,1000 #citire mesaj criptat de lungime maxima 1000
  150. la $a0,mesajc
  151. li $v0,8
  152. syscall
  153.  
  154. li $t0,0 #indicele, care va reprenta lungimea sirului
  155.  
  156. #Incepem parcurgeream string-ului
  157. Ldecript:
  158. lb $t2,mesajc($t0) #litera din mesaj necriptat
  159. beqz $t2,Exit #Daca e null, terminare program, Exit
  160. li $t9,0 #Indice alfabet
  161. findInAlphC:
  162. lb $t8,alfabet($t9) #Gasirea literei in alfabet
  163. beq $t2,$t8,findInA #$t9 retine pozitia din alfabet al caracterului
  164. addi $t9,1 #t9 reprezinta pozitia literei in alfabet
  165. j findInAlphC
  166.  
  167. findInA:
  168. li $t8,0 #pozitia in adresa a unui element din vector
  169. li $t7,0 #indicele elem din vector
  170. loopInA:
  171. lw $t6,a($t8) #Cautam in a indicele corespunzator literei din mesaj criptat, care reprezinta decriptarea acesteia adica
  172. beq $t6,$t9,afisDecript #pozitia ei din vectorul alfabet
  173. addi $t8,4 #Cand o gasim afisam decriptarea acesteia
  174. addi $t7,1 #t1 reprezinta pozitia literei criptate in a adica criptare(t7) = t2 (litera criptata)
  175. j loopInA
  176.  
  177. afisDecript:
  178. rem $t7,$t7,27 #Facem modulo 27, pentru a o mentine in alfabet
  179. lb $a0,alfabet($t7) #Afisam litera decriptata corespunzatoare
  180. li $v0,11
  181. syscall
  182. addi $t0,1 #trecem la urmatoarea litera din mesaj criptat
  183. j Ldecript
  184.  
  185.  
  186.  
  187. notPrime: #Eroare p nu e prim, afisam mesaj + exit
  188. la $a0,errPrime
  189. li $v0,4
  190. syscall
  191. j Exit
  192.  
  193. assignGenException: #Caz cand p e 2
  194. li $t0,1
  195. j Lgen
  196.  
  197. errGenNotFound: #Caz cand input < 1
  198. la $a0,errGen
  199. li $v0,4
  200. syscall
  201. j Exit
  202.  
  203. Exit:
  204. li $v0,10
  205. syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement