O mica problema in ASM … de Craciun
Pentru ca tot era Craciunul si nu aveam ce face, m-am apucat de o mica problema in ASM ... am apelat la un coleg de facultate,Alex D., care mi-a dat urmatoarea problema : Sa se ordoneze un vector de numere naturale dupa numarul de biti necesari pentru a le scrie in baza 2 ... aveam deja bubble sort-ul implementat in asm ... Am procedat in felul urmator: stiam ca bubble sort compara, la un moment dat cate 2 elemente si verifica daca unul e mai mare ca celalalt. In loc de aceasta condiitie, eu trebuia sa aflu daca numarul de biti al primului e mai mare ca numarul de biti al celui de-al doilea... ca sa evit o seara "plina", am scris o alta functie, tot in asm , care imi returneaza numarul de biti pentru un numar. De aici totul a fost simplu ... ba nu ! Am stat o ora intreaga, uitandu-ma dupa pop-uri, push-uri, unele adrese se pierdeau, o adevarata dezordine... noroc cu prietenul meu AndreiASM ( numele spune tot
), care m-a ajutat cu diverse chestii tehnice pe care nu aveam de unde sa le cunosc ( apelarea unei functii cu parametri, etc. ) . In cele din urma, a rezultat codul de mai jos, care "merge", dar nu am absolut niciun chef sa ma mai bag pe el in caz ca gasesc vreo eroare...
-
#include <stdio.h>
-
#include <iostream>
-
using namespace std;
-
-
-
int nr_biti(int)
-
{
-
_asm
-
{
-
mov eax,[ebp+8]
-
cmp eax,0
-
je final
-
mov ebx,0
-
bucla:
-
cmp eax,0
-
je stop
-
inc ebx
-
shr eax,1
-
jmp bucla
-
stop:
-
mov eax,ebx
-
jmp stop2
-
final:
-
mov ebx,1
-
jmp stop
-
stop2:
-
-
}
-
}
-
-
void bubble_sort(int*,int)
-
{
-
_asm
-
{
-
bucla_mare:
-
mov ecx,0
-
mov eax,[ebp+8]
-
mov ebx,[ebp+12]
-
bucla_mica:
-
mov edx,eax
-
add edx,4
-
-
push dword ptr[eax]
-
push dword ptr[edx]
-
-
push eax
-
-
mov edi,eax
-
-
push dword ptr[edx]
-
call nr_biti
-
mov [edx],eax
-
add esp,4
-
-
push dword ptr[edi]
-
call nr_biti
-
mov [edi],eax
-
add esp,4
-
-
pop eax
-
push ecx
-
mov ecx,[edi]
-
mov [eax],ecx
-
pop ecx
-
mov esi,[eax]
-
cmp esi,[edx]
-
ja interschimbare
-
cmp esi,[edx]
-
jle nu_e
-
-
interschimbare:
-
pop dword ptr[edx]
-
pop dword ptr[eax]
-
push dword ptr [edx]
-
push dword ptr [eax]
-
pop dword ptr [edx]
-
pop dword ptr [eax]
-
mov ecx,1
-
jmp continua
-
nu_e: pop dword ptr[edx]
-
pop dword ptr[eax]
-
jmp continua
-
-
continua:
-
-
add eax,4
-
dec ebx
-
cmp ebx,1
-
jne bucla_mica
-
cmp ecx,1
-
je bucla_mare
-
}
-
}
-
-
int main()
-
{
-
int v[100],n,i;
-
cin>>n;
-
for(i=0;i<n;i++) cin>>v[i];
-
bubble_sort(v,n);
-
for(i=0;i<n;i++) cout<<v[i]<<' ';
-
system("pause");
-
return 0;
-
}