Advertisement
cmiN

inline asm sort O(N^2)

Dec 26th, 2012
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5.  
  6. void init(int * & vec, int & len)
  7. {
  8.     fputs("Numar elemente: ", stdout);
  9.     scanf("%d", &len);
  10.     vec = (int *)malloc(sizeof(int) * len);
  11.     if (!vec)
  12.         exit(EXIT_FAILURE);
  13.     fputs("Elemente: ", stdout);
  14.     for (int i = 0; i < len; ++i)
  15.         scanf("%d", vec + i);
  16. }
  17.  
  18.  
  19. void show(int * vec, int len)
  20. {
  21.     fputs("Elemente: ", stdout);
  22.     for (int i = 0; i < len; ++i)
  23.         printf("%d ", vec[i]);
  24.     putchar('\n');
  25. }
  26.  
  27.  
  28. void bsort(int * vec, int len)
  29. {
  30.     int swed, k = 0;
  31.     do {
  32.         swed = 0;
  33.         ++k;
  34.         for (int i = 0; i < len - k; ++i)
  35.             if (vec[i] > vec[i + 1]) {
  36.                 swed = 1;
  37.                 vec[i] -= vec[i + 1];
  38.                 vec[i + 1] += vec[i];
  39.                 vec[i] = vec[i + 1] - vec[i];
  40.             }
  41.     } while (swed);
  42. }
  43.  
  44.  
  45. int main()
  46. {
  47.     int len = -1, * vec = NULL;
  48.  
  49.     init(vec, len);
  50.     //bsort(vec, len);
  51.  
  52.     // assembly bubble sort
  53.     _asm {
  54.         mov eax, len    ; lungimea vectorului
  55.         mov ebx, vec    ; pointer la primul element din vector
  56.  
  57.         while0:
  58.             ; executam cat timp avem interschimbari
  59.             xor edx, edx    ; marcam ca nu s-a facut vreo interschimbare
  60.             dec eax         ; trebuie sa verificam mai putin cu un element
  61.             xor ecx, ecx    ; pornim de la primul element
  62.  
  63.             for0:
  64.                 cmp ecx, eax
  65.                 jge _for0
  66.  
  67.                 if0:
  68.                     push eax                              ; salvam vechea valoare
  69.                     ; valoarea urmatorului element
  70.                     inc ecx
  71.                     mov eax, dword ptr [ebx+ecx*4]
  72.                     dec ecx
  73.                     cmp dword ptr [ebx+ecx*4], eax        ; comparam elementul curent cu cel urmator
  74.                     jle _if0                              ; nu avem nimic de facut
  75.                     ; interschimbam
  76.                     or edx, 1                             ; marcam efectuarea interschimbarii
  77.                     xor eax, dword ptr [ebx+ecx*4]
  78.                     xor dword ptr [ebx+ecx*4], eax
  79.                     xor eax, dword ptr [ebx+ecx*4]
  80.                     inc ecx
  81.                     mov dword ptr [ebx+ecx*4], eax
  82.                     dec ecx
  83.                 _if0:
  84.                     pop eax                               ; restauram lungimea
  85.  
  86.                 inc ecx
  87.                 jmp for0
  88.             _for0:
  89.  
  90.             cmp edx, 0
  91.             jne while0
  92.         _while0:
  93.     }
  94.     show(vec, len);
  95.     free(vec);
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement