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++:
-
#include <stdio.h>
-
-
int v[5];
-
/*
-
void interschimba(int &a,int &b)
-
{
-
int c;
-
c=a;
-
a=b;
-
b=c;
-
}
-
void Naiv_Sort(int v[],int n)
-
{
-
int i,poz,min,j;
-
for(i=0;i<n;i++)
-
{
-
min=v[i];
-
poz=i;
-
-
for(j=i+1;j<n;j++)
-
if(v[j]<min)
-
{
-
min=v[j];
-
poz=j;
-
}
-
interschimba(v[i],v[poz]);
-
}
-
}*/
-
-
void Naiv_Sort(int*,int)
-
{
-
_asm
-
{
-
mov ebx,0
-
for_mare:
-
mov ecx,[ebp+12]
-
dec ecx
-
cmp ebx,ecx
-
je gata
-
mov esi,[ebp+8]
-
//ajungem pe pozitia curenta
-
mov eax,ebx
-
shl eax,2
-
add esi,eax
-
//in esi avem pozitia curenta
-
//in eax avem minimul, in edx avem pozitia minimului
-
mov eax,[esi]
-
mov edx,ebx
-
//ecx va fi contorul celui de-al doilea for
-
mov ecx,ebx
-
inc ecx
-
add esi,4
-
for_mic:
-
cmp ecx,[ebp+12]
-
je stop
-
mov edi,[esi]
-
cmp edi,eax
-
jb schimba
-
jmp continua
-
schimba:
-
mov eax,[esi]
-
mov edx,ecx
-
jmp continua
-
continua:
-
add esi,4
-
inc ecx
-
jmp for_mic
-
stop:
-
mov esi,[ebp+8]
-
mov eax,ebx
-
shl eax,2
-
add esi,eax
-
mov edi,[ebp+8]
-
mov eax,edx
-
shl eax,2
-
add edi,eax
-
//in esi si edi am cele 2 adrese ale elementelor ce trebuie schimbate
-
-
push dword ptr [esi]
-
push dword ptr [edi]
-
pop dword ptr [esi]
-
pop dword ptr [edi]
-
-
inc ebx
-
jmp for_mare
-
gata:
-
-
}
-
}
-
-
-
int main()
-
{
-
int n,i;
-
n=5;
-
v[0]=10;v[1]=2;v[2]=1;v[3]=5;v[4]=6;
-
Naiv_Sort(v,n);
-
for(i=0;i<n;i++) printf("%d ",v[i]);
-
getchar();
-
return 0;
-
}