Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int main() {
- char s[] = "wyraz1 wyr2 wyr3 wyraz4 wyr5"; //
- printf("Wejscie: %s\n", s);
- asm volatile (
- ".intel_syntax noprefix;"
- "mov eax, %0;" // zaladowanie stringa
- "mov ebx, 0;" // licznik długości
- "liczenie_dlugosci:"
- "mov cl, [eax + ebx];" // wskaznik na char s[] + wskaznik na licznik(ebx),
- // sprawdzanie czy char jest 0, jesli nie to inc ebx
- "cmp cl, 0;" // jeśli [eax + ebx] to \0
- "je po_liczeniu;"
- "inc ebx;"
- "jmp liczenie_dlugosci;"
- "po_liczeniu:" // dodaje do ebx adres eax, czyli ebx wskazuje na koniec stringa, po czym dec ebx o 1 (\0)
- "add ebx, eax;" // ebx - adres znaku \0
- "dec ebx;" // ebx - adres ostaniego znaku
- "odwracanie_calosci:" // odwracanie ciągu między eax i ebx
- "cmp eax, ebx;" // porownanie adresu eax z ebx(nie jest to prawda eax wskazuje na poczatek stringa, a ebx na koniec)
- // swap polega na zamianie 1 wskaznik z ostatnim wskaznikiem, inc 1 wskaznik, dec ostatni wskaznik (petla)
- "jge po_odwroceniu_calosci;" // eax >= ebx => ciąg jest odwrócony
- "mov cl, [eax];"
- "mov dl, [ebx];"
- "mov [eax], dl;"
- "mov [ebx], cl;"
- "inc eax;"
- "dec ebx;"
- "jmp odwracanie_calosci;"
- "po_odwroceniu_calosci:" // eax wskazuje teraz poczatek odwroconego stringa, ebx taki sam jak eax
- "mov eax, %0;" // eax - znowu adres pierwszej litery
- "mov ebx, eax;" // ebx - adres pierwszej litery wyrazu, po przejściu pętli bedzie wskazywał na spację
- "znajdz_spacje:"
- "mov cl, [ebx];" // cl - dodatkowa zmienna, [ebx] - wartosc wskaznika, (cmp cl,32) - sprawdzenie czy wartosc to spacja
- // (cmp cl, 0) sprawdzenie czy jestesmy na koncu stringa, jesli nie to inc ebx(przesuniecie o jeden char)
- "cmp cl, 32;"
- "je mam_spacje;"
- "cmp cl, 0;"
- "je mam_spacje;" // jeśli doszliśmy do końca / spacji odwracamy ostatni wyraz po którym przechodziliśmy
- "inc ebx;" // jeśli nie, sprawdzamy kolejna literę
- "jmp znajdz_spacje;"
- "mam_spacje:" // po znalezieniu spacji
- "mov edi, ebx;" // edi = adres spacji
- "dec edi;" // edi = adres ostatniej litery
- "odwracanie_wyrazow:" // dziala jak odwracanie_calosci, tylko na innych rejestrach [można z tych dwóch pętli zrobic jedną]
- "cmp eax, edi;"
- "jge po_odwroceniu_wyrazu;" // eax >= edi => wyraz jest odwrócony
- "mov cl, [eax];"
- "mov dl, [edi];"
- "mov [eax], dl;"
- "mov [edi], cl;"
- "inc eax;"
- "dec edi;"
- "jmp odwracanie_wyrazow;"
- "po_odwroceniu_wyrazu:"
- "mov cl, [ebx];" // jeśli ebx wskazywało na \0 to koniec, jak na spację to G I T A R A
- "cmp cl, 0;"
- "je koniec;"
- "inc ebx;" // ebx - spacja, ebx + 1 znak po spacji
- "mov eax, ebx;" // eax zapamiętuje adres pierwszego znaku po miniętej spacji
- "jmp znajdz_spacje;"
- "koniec:"
- ".att_syntax prefix;"
- :
- :"r"(s)
- :"eax", "ebx","ecx", "edx", "edi"
- );
- printf("Wyjscie: %s\n", s);
- return 0;
- }
- //clear && gcc inv.c -m32 && ./a.out
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement