Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .type decrl @function
  2. decrl:
  3.     pushq   %rbp
  4.     movq    %rsp, %rbp
  5.     movq    16(%rbp), %rsi
  6.     movq    24(%rbp), %rcx
  7.     movq    $-1, %rdi
  8.     stc
  9. start:
  10.     incq    %rdi
  11.     sbbq    $0, (%rsi, %rdi, 8)
  12.     jc  start
  13.     movq    %rbp, %rsp
  14.     popq    %rbp
  15.     ret
  16.  
  17.  
  18. .type sqrint @function
  19. sqrint:
  20.     push    %rbp
  21.     mov %rsp, %rbp
  22.     andq    %rax, %rax      # Sprawdzamy czy rax = 0
  23.     jz  endf                # Jeśli tak do kończymy zwracając 0
  24.     movq    %rax, %rdx      # Parametr n do rdx
  25.     movq    $0, %rax        # Licznik / wynik
  26.     movq    $1, %rbx        # Aktualna liczba nieparzysta
  27. start:
  28.     subq    %rbx, %rdx      # Odejmujemy aktualną nieparzystą
  29.     jb  endf                # Jeśli wynik mniejszy od 0 to kończymy
  30.     incq    %rax            # Inkremementacja licznika
  31.     addq    $2, %rbx        # Kolejna liczba nieparzysta
  32.     jmp start               # Zapętlenie
  33. endf:
  34.     mov %rbp, %rsp
  35.     pop %rbp
  36.     ret
  37.  
  38.  
  39. .type fibonac @function
  40. fibonac:
  41.     pushq   %rbp
  42.     movq    %rsp, %rbp
  43.     movq    16(%rbp), %rcx
  44.     movq    $0, %rbx            # F(0)
  45.     movq    $1, %rax            # F(1)
  46.     decq    %rcx                # Dekrementacja rcx
  47.     jz  endf                    # Jeśli rcx = 0 to zwróć 1
  48.     jns start                   # Jeśli rcx > 0 to skocz do pętli
  49.     decq    %rax                # Jeśli rcx < 0 to zwróć 0
  50.     jmp endf                    # I skocz na koniec
  51. start:
  52.     addq    %rax, %rbx          # F(n + 1) = F(n - 1) + F(n)
  53.     xchgq   %rax, %rbx          # F(n - 1) <-> F(n)
  54.     loop    start               # Pętla
  55. endf:
  56.     movq    %rax, 16(%rbp)      # Umieszczenie wyniku na stosie
  57.     movq    %rbp, %rsp
  58.     popq    %rbp
  59.     ret
  60.  
  61.  
  62. .type inverseb @function
  63. inverseb:
  64.     push    %rbp
  65.     movq    %rsp, %rbp
  66.     movq    16(%rbp), %rbx          # Adres liczby
  67.     movq    24(%rbp), %rcx          # Parametr N
  68.  
  69.     movb    (%rbx), %al             # Kopia najbardziej znaczącego bajtu liczby w al
  70.     andb    %al, %al                # Test
  71.     jns endf                        # Jeśli SF = 0 (liczba dodatnia) to skocz na koniec
  72.     stc                             # Ustaw CF = 1
  73. negate:
  74.     notq    -8(%rbx, %rcx, 8)       # (%rbx, %rcx, 8) wskazuje na przestrzeń ZA liczbą,
  75.                                     # dlatego cofamy się o 8 bajtów do 8 najmniej znaczących bajtów liczby
  76.     adcq    $0, -8(%rbx, %rcx, 8)   # Dodajemy 1 / przeniesienie
  77.     loop    negate                  # Zapętlamy według rcx
  78.  
  79. endf:
  80.     movq    %rbp, %rsp
  81.     popq    %rbp
  82.     ret
  83.  
  84.  
  85. .type inversel @function
  86. inversel:
  87.     push    %rbp
  88.     movq    %rsp, %rbp
  89.     movq    16(%rbp), %rbx          # Adres liczby
  90.     movq    24(%rbp), %rcx          # Parametr N
  91.  
  92.     movq    -8(%rbx, %rcx, 8), %rax     # Kopia najbardziej znaczącej części liczby
  93.     andq    %rax, %rax              # Test
  94.     jns endf                        # Jeśli SF = 0 (liczba dodatnia) to skocz na koniec
  95.     movq    $0, %rdx                # Licznik
  96.     stc                             # Ustaw CF = 1
  97. negate:
  98.     notq    (%rbx, %rdx, 8)         # Negujemy nastepne 64 bity
  99.     adcq    $0, (%rbx, %rdx, 8)     # Dodajemy 1 / przeniesienie
  100.     incq    %rdx
  101.     loop    negate                  # Zapętlamy według rcx
  102. endf:
  103.     movq    %rbp, %rsp
  104.     popq    %rbp
  105.     ret
  106.  
  107.  
  108. .type gcd @function
  109. gcd:
  110.     pushq   %rbp
  111.     movq    %rsp, %rbp
  112.     movq    16(%rbp), %rax          # Liczba a
  113.     movq    24(%rbp), %rbx          # Liczba b
  114. start:
  115.     andq    %rbx, %rbx          # Sprawadzmy czy b = 0
  116.     jz  endf                    # Jeśli tak to skok na koniec
  117.     movq    $0, %rdx            # 0 do rdx do dzielenia
  118.     divq    %rbx                # Dzielimy rax / rbx
  119.     movq    %rdx, %rax          # Reszta do rax
  120.     xchgq   %rax, %rbx          # Wymiana rax <-> rbx
  121.     jmp start                   # Pętla
  122. endf:
  123.     movq    %rbp, %rsp
  124.     popq    %rbp
  125.     ret
  126.  
  127.  
  128. OFFSET = 'z' - 'a' + 1
  129. .type cezar @function
  130. cezar:
  131.     pushq   %rbp
  132.     movq    %rsp, %rbp
  133.     movq    16(%rbp), %rsi          # Adres ciągu
  134.     movq    24(%rbp), %rdx          # Klucz
  135.     subq    $'a', %rdx              # Klucz -> liczba
  136.     movq    $-1, %rcx               # Licznik na -1
  137. start:
  138.     incq    %rcx                    # Inkrementacja licznika
  139.     movb    (%rsi, %rcx, 1), %bl    # Kolejny znak
  140.     cmpb    $'\n', %bl              # Jeśli znak nowej linii
  141.     je  endf                        # To zakończ
  142.     cmpb    $' ', %bl               # Jeśli spacja
  143.     je  start                       # To skocz do kolejnej iteracji
  144.     orb $0x20, %bl                  # Wymuś małe litery
  145.     addq    %rdx, %rbx              # Dodaj klucz do znaku
  146.     cmpq    $'z', %rbx              # Jeśli otzrymany znak mieści się w zakresie
  147.     jle save                        # Skocz do końca iteracji
  148.     subq    $OFFSET, %rbx           # W przeciwnym razie odejmij offset
  149. save:
  150.     movb    %bl, (%rsi, %rcx, 1)    # Wpisz zaszyfrowany znak do pamięci
  151.     jmp start                       # Zapętl
  152. endf:
  153.     movq    %rbp, %rsp
  154.     popq    %rbp
  155.     ret
  156.  
  157.  
  158. .type atoix @function
  159. atoix:
  160.     pushq   %rbp
  161.     movq    %rsp, %rbp
  162.     movq    16(%rbp), %rsi
  163.     movq    24(%rbp), %rcx
  164.     movq    $0, %rax            # 0 do rax
  165.     movq    $10, %rdi           # 10 do rdi do mnożenia
  166. start:
  167.     movb    (%rsi), %bl         # Kolejny bajt do bl
  168.     subb    $'0', %bl           # Konwersja ASCII -> cyfra
  169.     mulq    %rdi                # Mnożenie rax * 10
  170.     addq    %rbx, %rax          # Dodanie cyfry do rax
  171.     incq    %rsi                # Przesunięcie adresu na kolejny bajt
  172.     loop    start               # Pętla
  173.     movq    %rbp, %rsp
  174.     popq    %rbp
  175.     ret
  176.  
  177.  
  178. .type max2 @function
  179. max2:
  180.     pushq   %rbp
  181.     movq    %rsp, %rbp
  182.     movq    16(%rbp), %rsi
  183.     movq    24(%rbp), %rcx
  184.     decq    %rcx                # Wykonujemy n - 1 porównań
  185.     movq    %rsi, %rax          # Adres największej liczby (na początku przyjmujemy pierwszą)
  186.     movq    8(%rsi), %rdx       # Wyższa część aktualnie największe liczby
  187.     movq    (%rsi), %rbx        # Niższa część aktualnie największej liczby
  188. start:
  189.     addq    $16, %rsi           # Przesuwamy wskaźnik na następną liczbę
  190.     cmpq    8(%rsi), %rdx       # Porównujemy wyższą część aktualnej liczby z największą
  191.     jl  bigger                  # Jeśli większa to skok
  192.     je  equal                   # Jeśli równa to porównaj niższą część
  193.     jmp repeat                  # Jeśli mniejsza to następna liczba
  194. equal:
  195.     cmpq    (%rsi), %rbx        # Porównujemy niższą część aktualnej liczby z największą
  196.     jl  bigger                  # Jeśli większa to skok
  197.     jmp repeat                  # Jeśli mniejsza bądź równa to następna liczba
  198. bigger:
  199.     movq    8(%rsi), %rdx       # Zapisz wyższą część aktualnej liczby jako największą
  200.     movq    (%rsi), %rbx        # Zapisz niższą część aktualnej liczby jako największą
  201.     movq    %rsi, %rax          # Zapisz adres aktualnej liczby
  202. repeat:
  203.     loop    start               # Zapętl według rcx
  204.     movq    %rax, %rbx          # wynik w rbx (polecenie)
  205.     movq    %rbp, %rsp
  206.     popq    %rbp
  207.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement