Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .data
  2.    # Mesajul afisat in cazul in care p nu este prim
  3.     msg_nu_e_prim: .asciiz "Numarul dat nu este prim"
  4.  
  5.     # Helpers
  6.     nl: .asciiz "\n" # newline
  7.  
  8. .text
  9. # Functie care primeste ca parametru un numar natural (n) >= 2 si
  10. # intoarce in $v0 1 daca parametrul e prim sau 0 altfel
  11. is_prime:
  12.    # Parametrul:
  13.    # $sp: (n)
  14.  
  15.     # Salveaza $fp curent in stiva
  16.     subu $sp, 4
  17.     sw $fp, 0($sp)
  18.    # $sp: ($fp vechi)(n)
  19.  
  20.     # $fp pointeaza la parametru
  21.     addi $fp, $sp, 4
  22.    # $sp: ($fp vechi)(n)
  23.    # $fp: (n)
  24.  
  25.     # Salveaza valoare curenta a lui $s0 in stiva
  26.     subu $sp, 4
  27.     sw $s0, 0($sp)
  28.    # $sp: ($s0 vechi)($fp vechi)(n)
  29.    # $fp: (n)
  30.  
  31.     # AKA $s0 = n
  32.     lw $s0, 0($fp)
  33.  
  34.     # By default, incarca 1(afirmativ) in $v0
  35.     li $v0, 1
  36.  
  37.     # Verifica daca n e prim
  38.    #
  39.    # $t0 e divizorul curent. Incerc sa vad dac n % $t0 == 0. Daca da,
  40.    # atunci am gasit un divizor deci n nu e prim.
  41.     li $t0, 2
  42.    # $t1 tine numarul pana la care verific daca am gasit un divizor
  43.    # $t1 == n / 2
  44.     div $t1, $s0, 2
  45.  
  46.     # for(div = 2; div <= n / 2; ++div)
  47. loop_div:
  48.    # if $t0 > $t1 then goto exit_function
  49.    #    ^^^   ^^^
  50.    #    ^^^   n / 2
  51.    #    ^^^
  52.    #    divizorul curent(div)
  53.     bgt $t0, $t1, exit_function
  54.  
  55.     # Verifica daca n % div == 0
  56.     rem $t2, $s0, $t0
  57.     beqz $t2, not_prime
  58.     j increment_div
  59.  
  60.     # Numarul nu e prim, iesi din functie
  61. not_prime:
  62.     li $v0, 0
  63.     j exit_function
  64.  
  65.     # Incrementare
  66. increment_div:
  67.     addi $t0, 1
  68.     j loop_div
  69.  
  70. exit_function:
  71.    # CLEANUP
  72.    # Restaureaza valoarea lui $s0
  73.     lw $s0, -8($fp)
  74.    # Si a lui $fp
  75.     lw $fp, -4($fp)
  76.    # Stiva pointeaza iar la n
  77.     addu $sp, 8
  78.  
  79.     # return
  80.     jr $ra
  81.  
  82. main:
  83.    # Citeste pe p
  84.     li $v0, 5
  85.     syscall
  86.  
  87.     # Pune-l in stiva
  88.     subu $sp, 4
  89.     sw $v0, 0($sp)
  90.  
  91.     # Vezi daca e prim
  92.     jal is_prime
  93.  
  94.     # Continua daca e prim, afiseaza mesaj altfel
  95.     beqz $v0, do_not_continue
  96.  
  97.     j exit_program
  98.  
  99.     # Afiseaza ca numarul nu e prim si termina programul
  100. do_not_continue:
  101.     li $v0, 4
  102.     la $a0, msg_nu_e_prim
  103.     syscall
  104.     li $v0, 4
  105.     la $a0, nl
  106.     syscall
  107.  
  108.     # EXIT
  109. exit_program:
  110.     li $v0, 10
  111.     syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement