Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. SYSEXIT = 1
  2. EXIT_SUCCESS = 0
  3.  
  4. .data
  5. #relaizujemy zadanie liczba2*liczba1
  6. liczba1:
  7.         .long 0x10304008, 0x701100FF, 0x45100020, 0x08570030
  8. liczba1_len = (. - liczba1)/4 #zmienna przechowujaca dlugosc liczby1
  9.  
  10.  
  11. liczba2:
  12.         .long 0xF040500C, 0x00220026, 0x321000CB, 0x04520031
  13. liczba2_len = (. - liczba2)/4 #zmienna przechowujaca dlugosc liczby2
  14.  
  15.  
  16. wynik:
  17.     .space 64,0 #
  18. wynik_len = (. - wynik)/4 #zmienna przechowujaca dlugosc wyniku
  19.  
  20. .text
  21. .global _start
  22.  
  23. _start:
  24. clc #czyszczenie flag
  25. pushf #odlozenie czystych flag na stos
  26. push $liczba1_len #odlozenie na stos dlugosci liczby1
  27. push $0 #odlozenie na stos 0, za chwile zdjemiemy je do edi
  28.  
  29. duza_petla:
  30. pop %edi #zdjecie ze stosu wartosci licznika (bedzie to index pozycji w wyniku) do rejestru edi
  31. inc %edi #zwiekszenie licznika
  32. pop %esi #sciagam esi ze stosu (bedzie licznikiem petli duza_petla)
  33. cmp $0,%esi #sprawdzam czy esi jest juz zerem
  34. jz exit #jak jest to koncze
  35. dec %esi #jak nie to zmniejszam licznik o 1
  36. movl liczba1(,%esi, 4), %eax #wpisuje do eaxa aktualny fragment liczby1 wedlug licznika esi
  37. push %esi #odkladam licznika na stos
  38. push %edi #odkladam edi na stos
  39. mov $liczba2_len, %esi #wpisuje do rejestru esi dlugosc liczby drugiej (bedzie to licznik malej petli)
  40.  
  41. mala_petla: #mala to nazwa robocza, chodzi o to ze jest w duzej tj. zagniezdzona
  42. push %eax #odkladam na stois %eax (aktualny fragment liczba1)
  43. dec %esi #zmniejszam esi o 1
  44. dec %edi #zmniejszam edi o 1, wynik najpierw wpisuje na mlodsza czesc aktualnej pozycji w wyniku
  45. movl liczba2(,%esi, 4), %ebx  #wycinam fragment liczby2 i wkladam do ebx
  46. mull %ebx #mnoze ebx z eax, wynik zapisuje sie w eax i w edx
  47. wynikstop:
  48. addl %eax,wynik(,%edi,4) #dodaje eax do wyniku na najnizsza pozycje
  49. inc %edi #inkrementuje edi
  50. jc dodaj_nadmiar1 #jezeli jest nadmiar to przechodze do funkcji ktora go doda na pozycje kolejna
  51. wroc1: #callback dla funkcji dodajacej nadmiar
  52. addl %edx,wynik(,%edi,4) #dodaje do kolejnej pozycji druga porcje iloczynu
  53. inc %edi #inkrementuje edi
  54. jc dodaj_nadmiar2 #sprawdzam czy wystapil nadmiar
  55. wroc2: #callback dla funkcji dodajacej nadmiar
  56. pop %eax #sciagam eax ze stosu
  57. cmp $0,%esi #porownuje licznik malej petli czy sie skonczyl
  58. jz duza_petla #jezeli tak to wraca do duzej petli
  59. jmp mala_petla #jezeli nie to wciaz iteruje po liczbie2 w malej petli
  60.  
  61.  
  62. dodaj_nadmiar1:
  63. adcl $0,wynik(,%edi,4) #dodaje nadmiar tzn 0 z uwzglednieniem przeniesienia na kolejna pozycje wyniku
  64. clc #czyszcze flagi
  65. jmp wroc1 #wracam do malej petli
  66.  
  67. dodaj_nadmiar2:
  68. adcl $0,wynik(,%edi,4) #dodaje nadmiar tzn 0 z uwzglednieniem przeniesienia na kolejna pozycje wyniku
  69. clc #czyszce flagi
  70. jmp wroc2 #wracam do malej petli
  71.  
  72.  
  73. exit: #zakanczanie programu
  74. mov $SYSEXIT, %eax
  75. mov $EXIT_SUCCESS, %ebx
  76. int $0x80
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement