Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- p: .space 4 #retinem valoarea p
- a: .space 400
- mesajn: .space 400
- alfabet:.asciiz "ABCDEFGHIJKLMNOPQRSTUVWXYZ *"
- newl: .asciiz "\n"
- fgen: .asciiz "Generatoul g este: "
- errPrime: .asciiz "P nu este un numar prim!"
- errGen: .asciiz "Eroare Generator(404)"
- .text
- main:
- ######
- ##Rezolvare punctul a
- ######
- #Citire p
- li $v0,5 #citire int
- syscall
- sw $v0,p #punem val citita in p
- #Verificare p prim
- li $t0,2 #Punem in $t0 divizorul posibil al lui p
- mul $t1,$t0,$t0 #Folosim $t1 pentru conditie only, echivalentul cu i*i<=n (pentru eficienta)
- lw $t2,p #In $t2 il retinem pe p
- Lprim:
- bgt $t1,$t2,findGen #Daca trece for-ul de divizibilitate, inseamna ca p e prim, deci cotinuam rezolvarea problemei
- rem $t3,$t2,$t0 # $t3 = $t2 % $t0 (Restul impartirii la $t0, nu la $t1!!)
- beq $t3,$0,notPrime # Daca $t3!=0 atunci p nu e prim, incheiem programul
- addi $t0,$t0,1 # Adaugare 1 la indice
- mul $t1,$t0,$t0 # Facem update la "i*i"
- j Lprim
- #Continuarea problemei
- findGen:
- lw $t1,p #Retinerea lui p in $t1
- li $t0,2 #In $t0 retinem numarul generatorului, incepem de la 2
- beq $t1,$t0,assignGenException #In cazul ca p=2, vom folosi generatorul 1
- Lgen:
- bge $t0,$t1,errGenNotFound #Nu e posibil sa ajunga in cazul errGenNotFound, daca input-ul e corect
- li $t9,0 #$t9 reprezinta pozitia in vector(din 4 in 4)
- li $t8,0 #$t8 reprezinta indicele vectorului
- Lvectgen:
- bge $t8,$t1,genCorect
- li $t7,1 #Valoarea lui g mod p
- li $t6,1 #Puterea la care e ridicat g-ul ($t7)
- ridPut:
- bgt $t6,$t8,verificUnic
- mul $t7,$t7,$t0 # $t7 = ($t7 * g) % p
- rem $t7,$t7,$t1
- addi $t6,$t6,1
- j ridPut
- verificUnic: #Verifica daca mai e un element egal in vector cu un for pana la ultimul element din vector
- #Incep de la pozitia 1 pentru ca g^0 va fi intotdeauna 1, si se poate demonstra ca
- #va mai exista un elem 1 doar in pozitia g^(p-1) cu ajutorul inversului modular, deoarece p e prim:
- # g^(p-2)=1(mod p)=> g^(p-1)%p=1 oricare ar fi g<p
- li $t5,4 #reprezinta pozitia pe memoria vect
- li $t4,1 #reprezinta indicele pe vect
- loopVect:
- bge $t4,$t8,addInV
- lw $t3,a($t5)
- beq $t7,$t3,genGresit
- addi $t5,$t5,4
- addi $t4,$t4,1
- j loopVect
- addInV:
- sw $t7,a($t9) #adaugam in vector si marim indicele
- addi $t8,$t8,1
- addi $t9,$t9,4
- j Lvectgen
- genGresit:
- addi $t0,$t0,1
- j Lgen
- #Am gasit generatorul, se afla in $t0
- genCorect:
- la $a0,fgen
- li $v0,4
- syscall
- move $a0,$t0
- li $v0,1
- syscall
- la $a0,newl
- li $v0,4
- syscall
- ######
- ##Rezolvare punctul b
- ######
- li $a1,400 #citire mesaj necriptat de lungime maxima 400
- la $a0,mesajn
- li $v0,8
- syscall
- li $t0,0 #indicele, care va reprenta lungimea sirului, in t1 se afla p
- #Incepem parcurgeream string-ului
- Lcript:
- lb $t2,mesajn($t0)
- beqz $t2,doneCript
- li $t9,0
- findInAlph:
- lb $t8,alfabet($t9)
- beq $t2,$t8,afisCript #$t9 retine pozitia din alfabet al caracterului
- addi $t9,1
- j findInAlph
- afisCript:
- lw $t9,a($t9) #Pozitia din alfabet a literei criptate
- lb $a0,alfabet($t9)
- li $v0,11
- syscall
- addi $t0,1
- j Lcript
- doneCript:
- li $v0,10
- syscall
- notPrime: #Eroare p nu e prim, afisam mesaj + exit
- la $a0,errPrime
- li $v0,4
- syscall
- j Exit
- assignGenException:
- li $t0,1
- j Lgen
- errGenNotFound:
- la $a0,errGen
- li $v0,4
- syscall
- j Exit
- Exit:
- li $v0,10
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement