Advertisement
Guest User

Untitled

a guest
May 10th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .data
  2. STDOUT = 1
  3. SYSWRITE = 1
  4. SYSEXIT = 60
  5. EXIT_SUCCESS = 0
  6. ILOSC_LICZB = 9999    # Ilość liczb jakie sprawdzić ma algorytm.
  7. PODSTAWA_WYJSCIA = 10 # Stałe wykorzystywane przy wyświetlaniu liczb.
  8. POCZATEK_LICZB = 0x30 # -||-
  9. NOWA_LINIA = 0xA      # -||-
  10.  
  11. .bss
  12. .comm sito_bufor, 9999 # Bufor wartości 0/1 decydujących czy dana
  13.                       # liczba (indeks+2) jest liczbą pierwszą
  14.                       # czy nie. Jego rozmiar to ilość liczb
  15.                       # do wygenerowanie-2.
  16. .comm liczby, 79992 # Bufor przechowujący liczby pierwsze
  17.                    # wygenerowane przez algorytm. Każda liczba
  18.                    # zapisywana jest na 64 bitach, czyli 8 bajtach,
  19.                    # więc jego rozmiar to 8*rozmiar poprzedniego
  20.                    # bufora.
  21. .comm textinv, 512  # Bufory wykorzystywane do zamiany liczb
  22. .comm textout, 512  # na postać ciągów kodów ASCII kolejnych cyfr.
  23.  
  24. .text
  25. .globl _start
  26.  
  27. _start:
  28. #
  29. # Wywołanie funkcji realizującej algorytm sita Eratostenesa.
  30. # Jej kod został umieszczony na końcu programu.
  31. #
  32. call sito_eratostenesa
  33.  
  34.  
  35.  
  36. #
  37. # WYŚWIETLENIE WYNIKU DZIAŁANIA ALGORYTMU
  38. #
  39. # Zamiana wartości liczb wygenerowanych i umieszczonych przez
  40. # algorytm w buforze "liczby" do postaci ciągów kodów ASCII
  41. # i ich wyświetlanie.
  42. #
  43.  
  44. mov $0, %r8 # Licznik do pętli - zostanie ona wykonana dla każdej
  45.            # komórki bufora "liczby". Liczby o wartości zero nie
  46.            # zostaną wyświetlone.
  47.  
  48. petla1:
  49. mov liczby(, %r8, 8), %rax # Skopiowanie liczby do rejestru RAX
  50. cmp $0, %rax
  51. je pomin # Jeśli liczba jest równa 0, pominięcie konwersji
  52.         # i wyświetlania
  53.  
  54. #
  55. # DEKODOWANIE WARTOŚCI LICZBY W PĘTLI
  56. #
  57.  
  58. mov $PODSTAWA_WYJSCIA, %rbx
  59. mov $0, %rcx
  60.  
  61. petla2:
  62. mov $0, %rdx
  63. div %rbx
  64. # Dzielenie bez znaku liczby z rejestru RAX przez RBX
  65. # i zapis wyniku do RAX oraz reszty z dzielenie do RDX.
  66. # Reszta z dzielenia to przy każdej iteracji pętli kolejna
  67. # pozycja wyniku. Po dodaniu kodu znaku pierwszej liczby,
  68. # są to kody znaków ASCII liczb na kolejnych pozycjach.
  69. add $POCZATEK_LICZB, %rdx
  70. # Zapis znaków do bufora w odwrotnej kolejności
  71. mov %dl, textinv(, %rcx, 1)
  72.  
  73. # Zwiększenie licznika i w kolejnych iteracjach powrót
  74. # na początek pętli, aż do uzyskania zerowego wyniku dzielenia
  75. inc %rcx
  76. cmp $0, %rax
  77. jne petla2
  78. jmp przed_petla3
  79.  
  80. #
  81. # ODWRÓCENIE KOLEJNOŚCI CYFR
  82. #
  83.  
  84. # Po wykonaniu ostatniego kroku, cyfry zapisane są w buforze
  85. # w odwrotnej kolejności, w tej pętli są przepisywane z końca
  86. # na początek do nowego bufora textout.
  87. przed_petla3:
  88. mov $0, %rdi
  89. mov %rcx, %rsi
  90. dec %rsi
  91.  
  92. petla3:
  93. mov textinv(, %rsi, 1), %rax
  94. mov %rax, textout(, %rdi, 1)
  95.  
  96. inc %rdi
  97. dec %rsi
  98. cmp %rcx, %rdi
  99. jle petla3
  100.  
  101. #
  102. # WYŚWIETLENIE LICZBY
  103. #
  104.  
  105. # Dopisanie na końcu bufora wyjściowego znaku nowej linii
  106. movb $NOWA_LINIA, textout(, %rcx, 1)
  107. inc %rcx
  108.  
  109. # Wyświetlenie tekstu z bufora textout
  110. mov $SYSWRITE, %rax
  111. mov $STDOUT, %rdi
  112. mov $textout, %rsi
  113. mov %rcx, %rdx
  114. syscall
  115.  
  116. pomin:
  117. # Powrót na początek pętli aż do wykonania instrukcji dla
  118. # wszystkich liczb.
  119. inc %r8
  120. cmp $ILOSC_LICZB, %r8
  121. jl petla1
  122.  
  123.  
  124.  
  125. #
  126. # ZAKOŃCZENIE PROGRAMU
  127. #
  128. mov $SYSEXIT, %rax
  129. mov $EXIT_SUCCESS, %rdi
  130. syscall
  131.  
  132.  
  133.  
  134. #
  135. # FUNKCJA REALIZUJĄCA ALGORYTM SITA ERATOSTENESA
  136. #
  137. sito_eratostenesa:
  138.  
  139. # Czyszczenie bufora liczb i sita w pętli
  140. mov $ILOSC_LICZB, %rdi
  141. sito_petla1:
  142.     dec %rdi
  143.     movb $1, sito_bufor(, %rdi, 1)
  144.     movq $0, liczby(, %rdi, 8)
  145. cmp $0, %rdi
  146. jg sito_petla1
  147.  
  148. # Pętla wykonująca się dla każdej liczby z sita
  149. # [ for(i=2; i<$ILOSC_LICZB+2; i++) ]
  150. mov $0, %r10
  151. mov $0, %rdi # Licznik indeksów w buforze sita
  152.             # - od 0 do $ILOSC_LICZB.
  153. mov $2, %rsi # Licznik wartości elementów odpowiadających
  154.             # indeksom w buforze sita. Dla pierwszego elementu
  155.             # z bufora tj. o indeksie 0, wartością będzie 2,
  156.             # ponieważ w obliczeniach pomijamy liczby 0 i 1.
  157.  
  158. sito_petla2:
  159.    # Jeśli aktualna liczba nie jest liczbą pierwszą przechodzimy
  160.    # do kolejnego wykonania pętli.
  161.    # [ if(sito[i-2] == 0) continue; ]
  162.     mov sito_bufor(, %rdi, 1), %al
  163.     cmp $0, %al
  164.     je sito_pomin2
  165.  
  166.     # Jeśli liczba jest liczbą pierwszą tj. w buforze sita ma
  167.    # przypisaną wartość true, dopisujemy ją do bufora "liczby".
  168.     mov %rsi, liczby(, %r10, 8)
  169.     inc %r10
  170.  
  171.     # Oznaczenie każdej wielokrotności wybranej liczby w buforze
  172.    # sita jako liczbę nie pierwszą - tj. przypisanie jej wartości 0.
  173.    # [ for(j=i; j<$ILOSC_LICZB+2; j+=i) ]
  174.     mov %rdi, %r8 # Licznik indeksów w buforze sita
  175.                  # - od (i-2) do $ILOSC_LICZB.
  176.     mov %rsi, %r9 # Licznik wartości - od i do $ILOSC_LICZB+2.
  177.     sito_petla3:
  178.         mov $0, %al
  179.         mov %al, sito_bufor(, %r8, 1)
  180.     add %rsi, %r8
  181.     add %rsi, %r9
  182.     cmp $ILOSC_LICZB, %r8
  183.     jl sito_petla3
  184.  
  185.     sito_pomin2:
  186. # Zwiększenie liczników i ew. powrót na początek pętli głównej.
  187. inc %rdi
  188. inc %rsi
  189. cmp $ILOSC_LICZB, %rdi
  190. jl sito_petla2
  191.  
  192. ret # Powrót do miejsca wywołania funkcji
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement