Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .code32
  2. STDIN = 0
  3. STDOUT = 1
  4. SYSCALL = 0x80
  5. SYSEXIT = 1
  6. SYSWRITE = 4
  7. SYSREAD = 3
  8. EXIT_SUCCESS = 0
  9.  
  10. .global _start
  11.  
  12. .text
  13. result: .string "Otrzymany wynik %x%x%x%x%x%x%x%x \n"
  14.  
  15. .data                                                          
  16. bufor: .space 16                #rezerwuję sobie więcej pamieci dla drugiej liczby
  17.  
  18. liczba1: .long 0x22222222, 0x33333333
  19. liczba1_len = (. - liczba1)/4
  20.  
  21. liczba2: .long 0x11111111, 0x11111111
  22. liczba2_len = (. - liczba1)/4
  23.  
  24.  
  25. _start:
  26.  
  27. mov $liczba2_len, %edi      
  28. dec %edi                
  29.  
  30. alignNumbers:                   #wyrównywanie długości liczb
  31.     mov liczba2(,%edi,4), %eax  #kopiuje fragment wartości 2 liczby do eax
  32.     mov bufor(,%edi,4), %ebx    #kopiuje zera do bufora
  33.  
  34.     adc %eax, %ebx              #dodaje wartość
  35.  
  36.     mov %ebx, bufor(,%edi,4)    #wynik dodawania przenosze do bufora
  37.  
  38.     cmp $0, %edi                #sprawdzam czy przeiterowałem po całej liczbie
  39.     jz process                  
  40.  
  41.     sub $1, %edi
  42.  
  43. jmp alignNumbers
  44.  
  45. process:
  46.     xor %edi, %edi              #zeruje rejestr
  47.     mov $liczba1_len, %edi      #przenosze dlugosc liczby1 do edi uzyskujac liczbe iteracji
  48.     clc                         #zeruje przeniesienie
  49.     pushf                       #push na stos
  50.  
  51. algorithm:                      #algorytm dodawania
  52.     clc                         #zeruje przeniseienie
  53.     popf                        #pop stosu
  54.     mov liczba1(,%edi,4), %eax  #przeniesienie liczb do rejestrow
  55.     mov bufor(,%edi,4), %ebx
  56.  
  57.     adc %eax, %ebx              #dodaje wartosci w rejestrach do siebie
  58.     push %ebx                   #wrzucam wynik na stos
  59.  
  60.     pushf                       #zapisuje flage przeniesienia
  61.  
  62.     cmp $0, %edi                #sprawdzam czy jestesmy na koncu
  63.     jz last                     #jesli tak to skaczemy do wyliczania przeniesien
  64.  
  65.     sub $1, %edi                #jesli nie jestesmy na koncu to odejmujemy od licznika 1
  66.     jmp algorithm               #i wracamy na poczatek petli
  67.  
  68.  
  69. last:
  70.     popf                        #sciagamy flage przeniesienia ze stosu
  71.  
  72.     xor %eax, %eax              #czyscimy rejestry
  73.     xor %ebx, %ebx              
  74.  
  75.     adc %eax, %ebx              #dodajemy z uwzglednieniem przeniesienia
  76.  
  77.  
  78.     push %ebx                   #wrzucamy wynik na stos
  79.  
  80.     jmp end                     #przeskakujemy do zakonczenia
  81.  
  82. end:
  83.     pushl $result               #dodajemy na stos format wyswietlania danych
  84.     call printf
  85.  
  86. exit:
  87.     mov $SYSEXIT, %eax
  88.     mov $EXIT_SUCCESS, %ebx
  89.     int $SYSCALL
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement