Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int main() {
  4. char s[] = "wyraz1 wyr2 wyr3 wyraz4 wyr5"; //
  5. printf("Wejscie: %s\n", s);
  6. asm volatile (
  7. ".intel_syntax noprefix;"
  8.  
  9. "mov eax, %0;" // zaladowanie stringa
  10. "mov ebx, 0;" // licznik długości
  11.  
  12. "liczenie_dlugosci:"
  13. "mov cl, [eax + ebx];" // wskaznik na char s[] + wskaznik na licznik(ebx),
  14. // sprawdzanie czy char jest 0, jesli nie to inc ebx
  15. "cmp cl, 0;" // jeśli [eax + ebx] to \0
  16. "je po_liczeniu;"
  17. "inc ebx;"
  18. "jmp liczenie_dlugosci;"
  19.  
  20. "po_liczeniu:" // dodaje do ebx adres eax, czyli ebx wskazuje na koniec stringa, po czym dec ebx o 1 (\0)
  21. "add ebx, eax;" // ebx - adres znaku \0
  22. "dec ebx;" // ebx - adres ostaniego znaku
  23.  
  24. "odwracanie_calosci:" // odwracanie ciągu między eax i ebx
  25. "cmp eax, ebx;" // porownanie adresu eax z ebx(nie jest to prawda eax wskazuje na poczatek stringa, a ebx na koniec)
  26. // swap polega na zamianie 1 wskaznik z ostatnim wskaznikiem, inc 1 wskaznik, dec ostatni wskaznik (petla)
  27. "jge po_odwroceniu_calosci;" // eax >= ebx => ciąg jest odwrócony
  28. "mov cl, [eax];"
  29. "mov dl, [ebx];"
  30. "mov [eax], dl;"
  31. "mov [ebx], cl;"
  32. "inc eax;"
  33. "dec ebx;"
  34. "jmp odwracanie_calosci;"
  35.  
  36. "po_odwroceniu_calosci:" // eax wskazuje teraz poczatek odwroconego stringa, ebx taki sam jak eax
  37. "mov eax, %0;" // eax - znowu adres pierwszej litery
  38. "mov ebx, eax;" // ebx - adres pierwszej litery wyrazu, po przejściu pętli bedzie wskazywał na spację
  39.  
  40. "znajdz_spacje:"
  41. "mov cl, [ebx];" // cl - dodatkowa zmienna, [ebx] - wartosc wskaznika, (cmp cl,32) - sprawdzenie czy wartosc to spacja
  42. // (cmp cl, 0) sprawdzenie czy jestesmy na koncu stringa, jesli nie to inc ebx(przesuniecie o jeden char)
  43. "cmp cl, 32;"
  44. "je mam_spacje;"
  45. "cmp cl, 0;"
  46. "je mam_spacje;" // jeśli doszliśmy do końca / spacji odwracamy ostatni wyraz po którym przechodziliśmy
  47. "inc ebx;" // jeśli nie, sprawdzamy kolejna literę
  48. "jmp znajdz_spacje;"
  49.  
  50. "mam_spacje:" // po znalezieniu spacji
  51. "mov edi, ebx;" // edi = adres spacji
  52. "dec edi;" // edi = adres ostatniej litery
  53.  
  54.  
  55. "odwracanie_wyrazow:" // dziala jak odwracanie_calosci, tylko na innych rejestrach [można z tych dwóch pętli zrobic jedną]
  56. "cmp eax, edi;"
  57. "jge po_odwroceniu_wyrazu;" // eax >= edi => wyraz jest odwrócony
  58. "mov cl, [eax];"
  59. "mov dl, [edi];"
  60. "mov [eax], dl;"
  61. "mov [edi], cl;"
  62. "inc eax;"
  63. "dec edi;"
  64. "jmp odwracanie_wyrazow;"
  65.  
  66. "po_odwroceniu_wyrazu:"
  67. "mov cl, [ebx];" // jeśli ebx wskazywało na \0 to koniec, jak na spację to G I T A R A
  68. "cmp cl, 0;"
  69. "je koniec;"
  70. "inc ebx;" // ebx - spacja, ebx + 1 znak po spacji
  71. "mov eax, ebx;" // eax zapamiętuje adres pierwszego znaku po miniętej spacji
  72. "jmp znajdz_spacje;"
  73.  
  74.  
  75. "koniec:"
  76.  
  77. ".att_syntax prefix;"
  78. :
  79. :"r"(s)
  80. :"eax", "ebx","ecx", "edx", "edi"
  81.  
  82. );
  83.  
  84. printf("Wyjscie: %s\n", s);
  85. return 0;
  86. }
  87.  
  88. //clear && gcc inv.c -m32 && ./a.out
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement