Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int main(){
- int x = 0xFFF0FFFF; // 0000 1111 1111 1111 1111 1111 1111 1111
- int y;
- asm volatile (
- ".intel_syntax noprefix;"
- "mov eax, %1;"
- "mov ecx, 0;"
- "xor ebx,ebx;" // daje zero na ebx
- "xor edx,edx;"
- "and eax, eax;"
- "jz koniec;"
- "poczatek:"
- "shl eax;"
- "jnc niedodaj;"
- "inc ebx;"
- "jmp przejscie;"
- "niedodaj:"
- "cmp ebx, edx;"
- "jna przejscie;"
- "mov edx, ebx;"
- "xor ebx,ebx;"
- "przejscie:"
- "inc ecx;"
- "cmp ecx,32;"
- "jle poczatek;"
- /*
- "poczatek:"
- "shl eax;"
- "jnc niedodaj;"
- "inc ebx;"
- "jmp przejscie;"
- "niedodaj:"
- "mov edx, ebx;"
- "cmp ebx, edx;"
- "jle przejscie;"
- "xor ebx, ebx;"
- "przejscie:"
- "and eax, eax;"
- "jnz poczatek;"
- */
- "koniec:"
- "mov %0,edx;"
- ".att_syntax prefix;"
- :"=r"(y)
- :"r"(x)
- :"eax", "ebx", "ecx", "edx"
- );
- // ".intel_syntax noprefix;" ---> zmiana skladni na skladnie intela
- // ".att_syntax prefix;" ------> zmiana skladni na skladnie att
- // shl eax - shift left (przesun w lewo), najstarszy bit wpada do flagowego bitu c a najmlodszy staje sie zerem
- // shr eax - shift right (przesun w prawo), podobnie jak u gory, tylko odwrotnie
- printf("x=%i y=%i\n", x, y);
- return 0;
- }mbazak@sigma-ng:~/ArchitekturaK/lab3$ cd ..
- mbazak@sigma-ng:~/ArchitekturaK$ ls
- lab1 lab2 lab3 lab4 lab5
- mbazak@sigma-ng:~/ArchitekturaK$ cd lab4
- mbazak@sigma-ng:~/ArchitekturaK/lab4$ ls
- a.out Program2.c Program.c
- mbazak@sigma-ng:~/ArchitekturaK/lab4$ cat Program.c
- #include <stdio.h>
- int main() {
- char x[] = "Jeden, Dwa, Trzy, Cztery, Piec, Szesc, Siedem, Osiem, Dziewiec, Dziesiec,";
- int y = 0;
- asm volatile (
- ".intel_syntax noprefix;"
- "xor eax, eax;" // EAX PRZECHOWUJE DLUGOSC SLOWA, NP ALA, EAX = 3
- "xor ecx, ecx;"
- "xor edx, edx;"
- "dlugoscCalkowita:"
- "cmp BYTE PTR [%1 + eax], BYTE PTR 0;"
- "jz odwrocenie;"
- "inc eax;"
- "jmp dlugoscCalkowita;"
- "odwrocenie:" // ODWROCENIE CALEGO NAPISU
- "mov bl, BYTE PTR [%1 + ecx];" // OSTATNI ZNAK
- "mov bh, BYTE PTR [%1 + eax - 1];" // PIERWSZY ZNAK
- "mov [%1 + ecx], bh;"
- "mov [%1 + eax - 1], bl;"
- "inc ecx;"
- "dec eax;"
- "cmp eax, ecx;"
- "jnbe odwrocenie;"
- //ZEROWANIE LICZNIKOW
- "xor eax, eax;" // POZYCJA KONCA WYRAZU
- "xor ecx, ecx;" // POZYCJA NA KTOREJ WYRAZ SIE ZACZYNA
- "xor edx, edx;" // DLUGOSC WYRAZU
- "jmp dlugoscSlowa;"
- "dodajLiczniki:" // ecx jest wiekszy albo rowny eax, dodaje do niego (edx / 2 + 1), czyli polowe wyrazu i spacje za nim, zeby ustawic ecx na miejsce pierwszej litery nastepnego wyrazu
- "shr edx;"
- "inc edx;"
- "add ecx, edx;"
- "cmp [%1 + ecx], BYTE PTR 0;"
- "jz koniec;"
- "mov eax, ecx;"
- "xor edx, edx;"
- "dlugoscSlowa:"
- "cmp BYTE PTR [%1 + eax], BYTE PTR 0;"
- "jz zamiana;"
- "cmp BYTE PTR [%1 + eax], BYTE PTR 32;"
- "jz zamiana;"
- "inc eax;"
- "inc edx;"
- "jmp dlugoscSlowa;"
- "zamiana:"
- "cmp eax, ecx;"
- "jbe dodajLiczniki;"
- "mov bl, BYTE PTR [%1 + eax - 1];" // OSTATNI ZNAK
- "mov bh, BYTE PTR [%1 + ecx];" // PIERWSZY ZNAK
- "mov [%1 + eax - 1], bh;"
- "mov [%1 + ecx], bl;"
- "inc ecx;"
- "dec eax;"
- "jmp zamiana;"
- "koniec:"
- ".att_syntax prefix;"
- :"=r" (y)
- :"r" (&x)
- :"eax", "ebx", "ecx", "edx"
- );
- printf("x = %s \n", x);
- return 0;
- }mbazak@sigma-ng:~/ArchitekturaK/lab4$ gcc -m32 Program.c
- mbazak@sigma-ng:~/ArchitekturaK/lab4$ ls
- a.out Program2.c Program.c
- mbazak@sigma-ng:~/ArchitekturaK/lab4$ ./a.out
- x = Dziesiec, Dziewiec, Osiem, Siedem, Szesc, Piec, Cztery, Trzy, Dwa, Jeden,
- mbazak@sigma-ng:~/ArchitekturaK/lab4$ ls
- a.out Program2.c Program.c
- mbazak@sigma-ng:~/ArchitekturaK/lab4$ cd ..
- mbazak@sigma-ng:~/ArchitekturaK$ ls
- lab1 lab2 lab3 lab4 lab5
- mbazak@sigma-ng:~/ArchitekturaK$ cd lab5
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ ls
- funkcje.c Program.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ touch Program1.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ touch Odwracanie.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ nano Odwracanie.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ nano String.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ ./a.out
- x= dziala chyba stringow odwracanie
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ ls
- a.out funkcje.c Odwracanie.c Program1.c Program.c String.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
- String.c: Assembler messages:
- String.c:6: Error: ambiguous operand size for `cmp'
- String.c:6: Error: ambiguous operand size for `cmp'
- String.c:6: Error: ambiguous operand size for `cmp'
- String.c:6: Error: ambiguous operand size for `cmp'
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
- String.c: Assembler messages:
- String.c:6: Error: ambiguous operand size for `cmp'
- String.c:6: Error: ambiguous operand size for `cmp'
- String.c:6: Error: ambiguous operand size for `cmp'
- String.c:6: Error: ambiguous operand size for `cmp'
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ cat String.c
- #include <stdio.h>
- //odwracanie stringów
- int main(){
- char x[]="odwracanie stringow chyba dziala";
- int y;
- asm volatile(
- ".intel_syntax noprefix;"
- "mov eax,%1;"
- "xor ebx,ebx;"
- "dlugosc:"
- "cmp [eax+ebx],0;"
- "je zero;"
- "inc ebx;"//dlugosc stringa
- "jmp dlugosc;"
- "zero:"
- "sub ebx,1;"
- "mov edx,eax;"
- "add edx,ebx;"
- "przestawianie_zdania:"
- //"cmp %1,edx;"
- "jge koniec;"
- "mov cl,[eax];"
- "mov ch,[edx];"
- "mov [eax],ch;"
- "mov [edx],cl;"
- "inc eax;"
- "dec edx;"
- "jmp przestawianie_zdania;"
- "koniec:"
- "mov ebx,%1;"
- "mov eax,%1;"
- "mov edx,eax;"
- "petla2:"
- "szukanie:"
- "cmp [ebx],32;"
- "je znalezione;"
- "cmp [ebx],0;"
- "je znalezione;"
- "inc ebx;"
- "inc edx;"
- "jmp szukanie;"
- "znalezione:"
- "dec edx;"
- "odwracanie:"
- "cmp eax,edx;"
- "jge odwrocone;"
- "mov cl,[eax];"
- "mov ch,[edx];"
- "mov [eax],ch;"
- "mov [edx],cl;"
- "inc eax;"
- "dec edx;"
- "jmp odwracanie;"
- "odwrocone:"
- "cmp [ebx],0;"
- "je totalnyKoniec;"
- "inc ebx;"
- "mov edx,ebx;"
- "mov eax,ebx;"
- "jmp petla2;"
- "totalnyKoniec:"
- ".att_syntax prefix;"
- :"=r" (y)
- :"r" (x)
- :"eax","ebx","ecx","edx"
- );
- printf("%s \n ",x);
- return 0;
- }
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ ls
- a.out funkcje.c Odwracanie.c Program1.c Program.c String.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
- String.c: Assembler messages:
- String.c:6: Error: ambiguous operand size for `cmp'
- String.c:6: Error: ambiguous operand size for `cmp'
- String.c:6: Error: ambiguous operand size for `cmp'
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ ./a.out
- einacarwda wognirts abyhc olaizd
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ clear
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ ls
- a.out funkcje.c Odwracanie.c Program1.c Program.c String.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ ./a.out
- apuw juhc Dow
- mbazak@sigma-ng:~/ArchitekturaK/lab5$ cat String.c
- #include <stdio.h>
- //odwracanie stringów
- int main(){
- char x[]="Dupa chuj wow";
- int y;
- asm volatile(
- ".intel_syntax noprefix;"
- "mov eax,%1;"
- "xor ebx,ebx;"
- "dlugosc:"
- "cmp [eax+ebx], BYTE PTR 0;"
- "je zero;"
- "inc ebx;"//dlugosc stringa
- "jmp dlugosc;"
- "zero:"
- "sub ebx,1;"
- "mov edx,eax;"
- "add edx,ebx;" // edx -litery od poczatku
- "przestawianie_zdania:"
- "cmp %1,edx;"
- "jge koniec_przestawiania1;"
- "mov cl,[eax];" //swap liter
- "mov ch,[edx];"
- "mov [eax],ch;"
- "mov [edx],cl;"
- "inc eax;"
- "dec edx;"
- "jmp przestawianie_zdania;"
- "koniec_przestawiania1:"
- "mov ebx,%1;" // Adres litery co sprawdzamy
- "mov eax,%1;" // Adres 1 litery
- "mov edx, %1;" // Adres ostatniej litery
- "petla2:"
- "szukanie_spacji:"
- "cmp [ebx], BYTE PTR 32;"
- "je spacja_koniec;"
- "cmp [ebx], BYTE PTR 0;"
- "je spacja_koniec;"
- "inc ebx;"
- "inc edx;"
- "jmp szukanie_spacji;"
- "spacja_koniec:"
- "dec edx;"
- "odwracanie:"
- "cmp eax,edx;"
- "jge odwrocone;"
- "mov cl,[eax];"
- "mov ch,[edx];"
- "mov [eax],ch;"
- "mov [edx],cl;"
- "inc eax;"
- "dec edx;"
- "jmp odwracanie;"
- "odwrocone:"
- "cmp [ebx], BYTE PTR 0;"
- "je totalnyKoniec;"
- "inc ebx;"
- "mov edx,ebx;"
- "mov eax,ebx;"
- "jmp petla2;"
- "totalnyKoniec:"
- ".att_syntax prefix;"
- :"=r" (y)
- :"r" (x)
- :"eax","ebx","ecx","edx"
- );
- printf("%s \n ",x);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement