Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.76 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  
  5.         int x = 0xFFF0FFFF; // 0000 1111 1111 1111 1111 1111 1111 1111
  6.         int y;
  7.  
  8. asm volatile (
  9.                 ".intel_syntax noprefix;"
  10.                 "mov eax, %1;"
  11.         "mov ecx, 0;"
  12.                 "xor ebx,ebx;" // daje zero na ebx
  13.         "xor edx,edx;"
  14.                 "and eax, eax;"
  15.                 "jz koniec;"
  16.  
  17.  
  18.         "poczatek:"
  19.             "shl eax;"
  20.             "jnc niedodaj;"
  21.             "inc ebx;"
  22.             "jmp przejscie;"
  23.         "niedodaj:"
  24.             "cmp ebx, edx;"
  25.             "jna przejscie;"
  26.             "mov edx, ebx;"
  27.             "xor ebx,ebx;"
  28.         "przejscie:"
  29.             "inc ecx;"
  30.             "cmp ecx,32;"
  31.             "jle poczatek;"
  32.  
  33.  
  34.           /*
  35.  
  36.         "poczatek:"
  37.             "shl eax;"
  38.             "jnc niedodaj;"
  39.             "inc ebx;"
  40.             "jmp przejscie;"
  41.         "niedodaj:"
  42.  
  43.             "mov edx, ebx;"
  44.             "cmp ebx, edx;"
  45.             "jle przejscie;"
  46.             "xor ebx, ebx;"
  47.  
  48.         "przejscie:"
  49.             "and eax, eax;"
  50.             "jnz poczatek;"
  51.         */
  52.  
  53.  
  54.  
  55.  
  56.                 "koniec:"
  57.                 "mov %0,edx;"
  58.  
  59.                 ".att_syntax prefix;"
  60.                 :"=r"(y)
  61.                 :"r"(x)
  62.                 :"eax", "ebx", "ecx", "edx"
  63.         );
  64.  
  65.         // ".intel_syntax noprefix;" ---> zmiana skladni na skladnie intela
  66.         // ".att_syntax prefix;"  ------> zmiana skladni na skladnie att
  67.         // shl eax - shift left (przesun w lewo), najstarszy bit wpada do flagowego bitu c a najmlodszy staje sie zerem
  68.         // shr eax - shift right (przesun w prawo), podobnie jak u gory, tylko odwrotnie
  69.  
  70.         printf("x=%i y=%i\n", x, y);
  71.         return 0;
  72. }mbazak@sigma-ng:~/ArchitekturaK/lab3$ cd ..
  73. mbazak@sigma-ng:~/ArchitekturaK$ ls
  74. lab1  lab2  lab3  lab4  lab5
  75. mbazak@sigma-ng:~/ArchitekturaK$ cd lab4
  76. mbazak@sigma-ng:~/ArchitekturaK/lab4$ ls
  77. a.out  Program2.c  Program.c
  78. mbazak@sigma-ng:~/ArchitekturaK/lab4$ cat Program.c
  79. #include <stdio.h>
  80.  
  81. int main() {
  82.   char x[] = "Jeden, Dwa, Trzy, Cztery, Piec, Szesc, Siedem, Osiem, Dziewiec, Dziesiec,";
  83.   int y = 0;
  84.   asm volatile (
  85.     ".intel_syntax noprefix;"
  86.  
  87.     "xor eax, eax;" // EAX PRZECHOWUJE DLUGOSC SLOWA, NP ALA, EAX = 3
  88.     "xor ecx, ecx;"
  89.         "xor edx, edx;"
  90.     "dlugoscCalkowita:"
  91.       "cmp BYTE PTR [%1 + eax], BYTE PTR 0;"
  92.         "jz odwrocenie;"
  93.       "inc eax;"
  94.       "jmp dlugoscCalkowita;"
  95.     "odwrocenie:" // ODWROCENIE CALEGO NAPISU
  96.       "mov bl, BYTE PTR [%1 + ecx];" // OSTATNI ZNAK
  97.       "mov bh, BYTE PTR [%1 + eax - 1];" // PIERWSZY ZNAK
  98.       "mov [%1 + ecx], bh;"
  99.       "mov [%1 + eax - 1], bl;"
  100.       "inc ecx;"
  101.       "dec eax;"
  102.       "cmp eax, ecx;"
  103.         "jnbe odwrocenie;"
  104.     //ZEROWANIE LICZNIKOW
  105.     "xor eax, eax;" // POZYCJA KONCA WYRAZU
  106.     "xor ecx, ecx;" // POZYCJA NA KTOREJ WYRAZ SIE ZACZYNA
  107.     "xor edx, edx;" // DLUGOSC WYRAZU
  108.     "jmp dlugoscSlowa;"
  109.     "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
  110.       "shr edx;"
  111.       "inc edx;"
  112.       "add ecx, edx;"
  113.       "cmp [%1 + ecx], BYTE PTR 0;"
  114.         "jz koniec;"
  115.       "mov eax, ecx;"
  116.       "xor edx, edx;"
  117.     "dlugoscSlowa:"
  118.       "cmp BYTE PTR [%1 + eax], BYTE PTR 0;"
  119.         "jz zamiana;"
  120.       "cmp BYTE PTR [%1 + eax], BYTE PTR 32;"
  121.         "jz zamiana;"
  122.       "inc eax;"
  123.       "inc edx;"
  124.       "jmp dlugoscSlowa;"
  125.     "zamiana:"
  126.       "cmp eax, ecx;"
  127.         "jbe dodajLiczniki;"
  128.       "mov bl, BYTE PTR [%1 + eax - 1];" // OSTATNI ZNAK
  129.       "mov bh, BYTE PTR [%1 + ecx];" // PIERWSZY ZNAK
  130.       "mov [%1 + eax - 1], bh;"
  131.       "mov [%1 + ecx], bl;"
  132.       "inc ecx;"
  133.           "dec eax;"
  134.           "jmp zamiana;"
  135.     "koniec:"
  136.     ".att_syntax prefix;"
  137.     :"=r" (y)
  138.     :"r" (&x)
  139.     :"eax", "ebx", "ecx", "edx"
  140.  
  141.   );
  142.  
  143.   printf("x = %s \n", x);
  144.   return 0;
  145. }mbazak@sigma-ng:~/ArchitekturaK/lab4$ gcc -m32 Program.c
  146. mbazak@sigma-ng:~/ArchitekturaK/lab4$ ls
  147. a.out  Program2.c  Program.c
  148. mbazak@sigma-ng:~/ArchitekturaK/lab4$ ./a.out
  149. x = Dziesiec, Dziewiec, Osiem, Siedem, Szesc, Piec, Cztery, Trzy, Dwa, Jeden,
  150. mbazak@sigma-ng:~/ArchitekturaK/lab4$ ls
  151. a.out  Program2.c  Program.c
  152. mbazak@sigma-ng:~/ArchitekturaK/lab4$ cd ..
  153. mbazak@sigma-ng:~/ArchitekturaK$ ls
  154. lab1  lab2  lab3  lab4  lab5
  155. mbazak@sigma-ng:~/ArchitekturaK$ cd lab5
  156. mbazak@sigma-ng:~/ArchitekturaK/lab5$ ls
  157. funkcje.c  Program.c
  158. mbazak@sigma-ng:~/ArchitekturaK/lab5$ touch Program1.c
  159. mbazak@sigma-ng:~/ArchitekturaK/lab5$ touch Odwracanie.c
  160. mbazak@sigma-ng:~/ArchitekturaK/lab5$ nano Odwracanie.c
  161. mbazak@sigma-ng:~/ArchitekturaK/lab5$ nano String.c
  162. mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
  163. mbazak@sigma-ng:~/ArchitekturaK/lab5$ ./a.out
  164. x= dziala chyba stringow odwracanie
  165.  mbazak@sigma-ng:~/ArchitekturaK/lab5$ ls
  166. a.out  funkcje.c  Odwracanie.c  Program1.c  Program.c  String.c
  167. mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
  168. String.c: Assembler messages:
  169. String.c:6: Error: ambiguous operand size for `cmp'
  170. String.c:6: Error: ambiguous operand size for `cmp'
  171. String.c:6: Error: ambiguous operand size for `cmp'
  172. String.c:6: Error: ambiguous operand size for `cmp'
  173. mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
  174. String.c: Assembler messages:
  175. String.c:6: Error: ambiguous operand size for `cmp'
  176. String.c:6: Error: ambiguous operand size for `cmp'
  177. String.c:6: Error: ambiguous operand size for `cmp'
  178. String.c:6: Error: ambiguous operand size for `cmp'
  179. mbazak@sigma-ng:~/ArchitekturaK/lab5$ cat String.c
  180. #include <stdio.h>
  181. //odwracanie stringów
  182. int main(){
  183.         char x[]="odwracanie stringow chyba dziala";
  184.         int y;
  185.         asm volatile(
  186.             ".intel_syntax noprefix;"
  187.  
  188.             "mov eax,%1;"
  189.             "xor ebx,ebx;"
  190.  
  191.             "dlugosc:"
  192.                 "cmp [eax+ebx],0;"
  193.                 "je zero;"
  194.                 "inc ebx;"//dlugosc stringa
  195.                 "jmp dlugosc;"
  196.  
  197.             "zero:"
  198.             "sub ebx,1;"
  199.             "mov edx,eax;"
  200.             "add edx,ebx;"
  201.  
  202.             "przestawianie_zdania:"
  203.                 //"cmp %1,edx;"
  204.                 "jge koniec;"
  205.                 "mov cl,[eax];"
  206.                 "mov ch,[edx];"
  207.                 "mov [eax],ch;"
  208.                 "mov [edx],cl;"
  209.                 "inc eax;"
  210.                 "dec edx;"
  211.                 "jmp przestawianie_zdania;"
  212.             "koniec:"
  213.  
  214.             "mov ebx,%1;"
  215.             "mov eax,%1;"
  216.             "mov edx,eax;"
  217.  
  218.             "petla2:"
  219.                 "szukanie:"
  220.                     "cmp [ebx],32;"
  221.                     "je znalezione;"
  222.                     "cmp [ebx],0;"
  223.                     "je znalezione;"
  224.                     "inc ebx;"
  225.                     "inc edx;"
  226.                     "jmp szukanie;"
  227.                 "znalezione:"
  228.                     "dec edx;"
  229.                 "odwracanie:"
  230.                     "cmp eax,edx;"
  231.                     "jge odwrocone;"
  232.                     "mov cl,[eax];"
  233.                     "mov ch,[edx];"
  234.                     "mov [eax],ch;"
  235.                     "mov [edx],cl;"
  236.                     "inc eax;"
  237.                     "dec edx;"
  238.                     "jmp odwracanie;"
  239.                 "odwrocone:"
  240.                     "cmp [ebx],0;"
  241.                     "je totalnyKoniec;"
  242.                     "inc ebx;"
  243.                     "mov edx,ebx;"
  244.                     "mov eax,ebx;"
  245.                     "jmp petla2;"
  246.             "totalnyKoniec:"
  247.  
  248.             ".att_syntax prefix;"
  249.             :"=r" (y)
  250.             :"r" (x)
  251.             :"eax","ebx","ecx","edx"
  252.         );
  253.         printf("%s \n ",x);
  254.         return 0;
  255.  
  256. }
  257. mbazak@sigma-ng:~/ArchitekturaK/lab5$ ls
  258. a.out  funkcje.c  Odwracanie.c  Program1.c  Program.c  String.c
  259. mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
  260. String.c: Assembler messages:
  261. String.c:6: Error: ambiguous operand size for `cmp'
  262. String.c:6: Error: ambiguous operand size for `cmp'
  263. String.c:6: Error: ambiguous operand size for `cmp'
  264. mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
  265. mbazak@sigma-ng:~/ArchitekturaK/lab5$ ./a.out
  266. einacarwda wognirts abyhc olaizd
  267. mbazak@sigma-ng:~/ArchitekturaK/lab5$ clear
  268. mbazak@sigma-ng:~/ArchitekturaK/lab5$ ls
  269. a.out  funkcje.c  Odwracanie.c  Program1.c  Program.c  String.c
  270. mbazak@sigma-ng:~/ArchitekturaK/lab5$ gcc -m32 String.c
  271. mbazak@sigma-ng:~/ArchitekturaK/lab5$ ./a.out
  272. apuw juhc Dow
  273. mbazak@sigma-ng:~/ArchitekturaK/lab5$ cat String.c
  274. #include <stdio.h>
  275. //odwracanie stringów
  276. int main(){
  277.        char x[]="Dupa chuj wow";
  278.        int y;
  279.        asm volatile(
  280.            ".intel_syntax noprefix;"
  281.  
  282.            "mov eax,%1;"
  283.            "xor ebx,ebx;"
  284.  
  285.            "dlugosc:"
  286.                "cmp [eax+ebx], BYTE PTR 0;"
  287.                "je zero;"
  288.                "inc ebx;"//dlugosc stringa
  289.                "jmp dlugosc;"
  290.  
  291.            "zero:"
  292.            "sub ebx,1;"
  293.            "mov edx,eax;"
  294.            "add edx,ebx;" // edx -litery od poczatku
  295.  
  296.            "przestawianie_zdania:"
  297.                "cmp %1,edx;"
  298.                "jge koniec_przestawiania1;"
  299.                "mov cl,[eax];" //swap liter
  300.                "mov ch,[edx];"
  301.                "mov [eax],ch;"
  302.                "mov [edx],cl;"
  303.                "inc eax;"
  304.                "dec edx;"
  305.                "jmp przestawianie_zdania;"
  306.  
  307.            "koniec_przestawiania1:"
  308.  
  309.            "mov ebx,%1;" // Adres litery co sprawdzamy
  310.            "mov eax,%1;" // Adres 1 litery
  311.            "mov edx, %1;" // Adres ostatniej litery
  312.  
  313.            "petla2:"
  314.                "szukanie_spacji:"
  315.                    "cmp [ebx], BYTE PTR 32;"
  316.                    "je spacja_koniec;"
  317.                    "cmp [ebx], BYTE PTR 0;"
  318.                    "je spacja_koniec;"
  319.                    "inc ebx;"
  320.                    "inc edx;"
  321.                    "jmp szukanie_spacji;"
  322.                "spacja_koniec:"
  323.                    "dec edx;"
  324.                "odwracanie:"
  325.                    "cmp eax,edx;"
  326.                    "jge odwrocone;"
  327.                    "mov cl,[eax];"
  328.                    "mov ch,[edx];"
  329.                    "mov [eax],ch;"
  330.                    "mov [edx],cl;"
  331.                    "inc eax;"
  332.                    "dec edx;"
  333.                    "jmp odwracanie;"
  334.                "odwrocone:"
  335.                    "cmp [ebx], BYTE PTR 0;"
  336.                    "je totalnyKoniec;"
  337.                    "inc ebx;"
  338.                    "mov edx,ebx;"
  339.                    "mov eax,ebx;"
  340.                    "jmp petla2;"
  341.            "totalnyKoniec:"
  342.  
  343.            ".att_syntax prefix;"
  344.            :"=r" (y)
  345.            :"r" (x)
  346.            :"eax","ebx","ecx","edx"
  347.        );
  348.        printf("%s \n ",x);
  349.        return 0;
  350.  
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement