RSS Feed

Naiv Sort - C++/ASM

January 1st, 2008

Ah ... 2008 ... un nou an ... Dupa sampanie si cozonac ( meniu special de revelion ) , dupa artificii ( pe faleza Dunarii ) ...
Ma bucur cel putin ca acum folosesc un soft de anu asta ( Visual Studio 2008 ) , sunt trist ca in curand vin examenele, sunt bucuros ca in scurta vacanta de Craciun am reusit sa invat ASM ( un limbaj imposibil pentru mine la inceput - cu ocazia asta, tin sa-i multumesc lui AndreiASM .. de la el am invatat o buna parte a limbajului dar si profului ... printre cei mai de treaba de la FII ) ...
Si ca sa incep anul cu dreptul, m-am gandit in seara asta sa schimb algoritmul de anul trecut ( bubble sort ) , cu unul de "anul asta" ( naiv sort ) ... am implementat atat in C++ cat si in ASM ...

C++:
  1. #include <stdio.h>
  2.  
  3. int v[5];
  4. /*
  5. void interschimba(int &a,int &b)
  6. {
  7.     int c;
  8.     c=a;
  9.     a=b;
  10.     b=c;
  11. }
  12. void Naiv_Sort(int v[],int n)
  13. {
  14.     int i,poz,min,j;
  15.     for(i=0;i<n;i++)
  16.     {
  17.         min=v[i];
  18.         poz=i;
  19.        
  20.         for(j=i+1;j<n;j++)
  21.             if(v[j]<min)
  22.             {
  23.                 min=v[j];
  24.                 poz=j;
  25.             }
  26.         interschimba(v[i],v[poz]);
  27.     }
  28. }*/
  29.  
  30. void Naiv_Sort(int*,int)
  31. {
  32.     _asm
  33.     {
  34.         mov ebx,0
  35. for_mare:
  36.         mov ecx,[ebp+12]
  37.         dec ecx
  38.         cmp ebx,ecx
  39.         je gata
  40.         mov esi,[ebp+8]
  41.         //ajungem pe pozitia curenta
  42.         mov eax,ebx
  43.         shl eax,2
  44.         add esi,eax
  45.         //in esi avem pozitia curenta
  46.         //in eax avem minimul, in edx avem pozitia minimului
  47.         mov eax,[esi]
  48.         mov edx,ebx
  49.         //ecx va fi contorul celui de-al doilea for
  50.         mov ecx,ebx
  51.         inc ecx
  52.         add esi,4
  53. for_mic:
  54.         cmp ecx,[ebp+12]
  55.         je stop
  56.         mov edi,[esi]
  57.         cmp edi,eax
  58.         jb schimba
  59.         jmp continua
  60. schimba:
  61.         mov eax,[esi]
  62.         mov edx,ecx
  63.         jmp continua
  64. continua:
  65.         add esi,4
  66.         inc ecx
  67.         jmp for_mic
  68. stop:
  69.         mov esi,[ebp+8]
  70.         mov eax,ebx
  71.         shl eax,2
  72.         add esi,eax
  73.         mov edi,[ebp+8]
  74.         mov eax,edx
  75.         shl eax,2
  76.         add edi,eax
  77.         //in esi si edi am cele 2 adrese ale elementelor ce trebuie schimbate
  78.        
  79.         push dword ptr [esi]
  80.         push dword ptr [edi]
  81.         pop dword ptr [esi]
  82.         pop dword ptr [edi]
  83.  
  84.         inc ebx
  85.         jmp for_mare
  86. gata:
  87.  
  88.     }
  89. }
  90.  
  91.  
  92. int main()
  93. {
  94.     int n,i;
  95.     n=5;
  96.     v[0]=10;v[1]=2;v[2]=1;v[3]=5;v[4]=6;
  97.     Naiv_Sort(v,n);
  98.     for(i=0;i<n;i++) printf("%d ",v[i]);
  99.     getchar();
  100.     return 0;
  101. }

Leave a reply...