Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- # Mesajul afisat in cazul in care p nu este prim
- msg_nu_e_prim: .asciiz "Numarul dat nu este prim"
- # Helpers
- nl: .asciiz "\n" # newline
- .text
- # Functie care primeste ca parametru un numar natural (n) >= 2 si
- # intoarce in $v0 1 daca parametrul e prim sau 0 altfel
- is_prime:
- # Parametrul:
- # $sp: (n)
- # Salveaza $fp curent in stiva
- subu $sp, 4
- sw $fp, 0($sp)
- # $sp: ($fp vechi)(n)
- # $fp pointeaza la parametru
- addi $fp, $sp, 4
- # $sp: ($fp vechi)(n)
- # $fp: (n)
- # Salveaza valoare curenta a lui $s0 in stiva
- subu $sp, 4
- sw $s0, 0($sp)
- # $sp: ($s0 vechi)($fp vechi)(n)
- # $fp: (n)
- # AKA $s0 = n
- lw $s0, 0($fp)
- # By default, incarca 1(afirmativ) in $v0
- li $v0, 1
- # Verifica daca n e prim
- #
- # $t0 e divizorul curent. Incerc sa vad dac n % $t0 == 0. Daca da,
- # atunci am gasit un divizor deci n nu e prim.
- li $t0, 2
- # $t1 tine numarul pana la care verific daca am gasit un divizor
- # $t1 == n / 2
- div $t1, $s0, 2
- # for(div = 2; div <= n / 2; ++div)
- loop_div:
- # if $t0 > $t1 then goto exit_function
- # ^^^ ^^^
- # ^^^ n / 2
- # ^^^
- # divizorul curent(div)
- bgt $t0, $t1, exit_function
- # Verifica daca n % div == 0
- rem $t2, $s0, $t0
- beqz $t2, not_prime
- j increment_div
- # Numarul nu e prim, iesi din functie
- not_prime:
- li $v0, 0
- j exit_function
- # Incrementare
- increment_div:
- addi $t0, 1
- j loop_div
- exit_function:
- # CLEANUP
- # Restaureaza valoarea lui $s0
- lw $s0, -8($fp)
- # Si a lui $fp
- lw $fp, -4($fp)
- # Stiva pointeaza iar la n
- addu $sp, 8
- # return
- jr $ra
- main:
- # Citeste pe p
- li $v0, 5
- syscall
- # Pune-l in stiva
- subu $sp, 4
- sw $v0, 0($sp)
- # Vezi daca e prim
- jal is_prime
- # Continua daca e prim, afiseaza mesaj altfel
- beqz $v0, do_not_continue
- j exit_program
- # Afiseaza ca numarul nu e prim si termina programul
- do_not_continue:
- li $v0, 4
- la $a0, msg_nu_e_prim
- syscall
- li $v0, 4
- la $a0, nl
- syscall
- # EXIT
- exit_program:
- li $v0, 10
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement