Sa utilizam bubble sort …
M-am gandit sa ma mai joc putin cu bubble sort-ul, sa-l folosesc in cadrul unei anumite probleme. Problema care mi-a venit in minte este urmatoarea : Sa se scrie o functie care primeste ca parametru un numar natural si care returneaza cel mai mare numar care se poate forma cu cifrele sale . Algoritmul banal cu care se rezolva aceasta problema este urmatorul:
-retinem cifrele numarului intr-un vector
-le ordonam
-compunem noul numar
Am implementat totul in ASM desigur. Pentru a nu mai recurge la fel de fel de artificii, am organizat vectorul in felul urmator:
v[0] - numarul de cifre
v[1] ... v[v[0] - cifrele numarului
Bineinteles, am modificat usor bubble-sort-ul ( cel scris de mine avea nevoie de 2 variabile , un pointer catre primul element al vectorului, v[0] , si numarul de elemente ... cateva modificari minore si a fost gata. O alta problema care mi-a atras atentia la bubble sort a fost urmatoarea : ce se intampla daca exista un singur element in vector ? Am vrut sa merg la f**** masa si sa-l las asa, dar atunci cand compara v[i] cu v[i+1], sare la o adresa la care nu se gaseste nimic ... eroare
... am prevazut acest caz in functia maxim() . Este cel mai lung programel scris de mine in ASM ( vreo 90 linii de cod ) ... Sper sa nu mai am placerea sa scriu programe atat de lungi in ASM, e foarte dificil sa caut erori, chiar si cu ajutorul debugger-ului ... Iata codul...
-
#include <iostream>
-
using namespace std;
-
-
void bubble_sort(int*)
-
{
-
_asm
-
{
-
bucla_mare:
-
mov ecx,0
-
mov eax,[ebp+8]
-
mov ebx,[eax]
-
add eax,4
-
bucla_mica:
-
mov edx,eax
-
add edx,4
-
mov esi,[eax]
-
cmp esi,[edx]
-
ja interschimbare
-
jmp continua
-
interschimbare:
-
push dword ptr [edx]
-
push dword ptr [eax]
-
pop dword ptr [edx]
-
pop dword ptr [eax]
-
mov ecx,1
-
jmp continua
-
continua:
-
add eax,4
-
dec ebx
-
cmp ebx,1
-
jne bucla_mica
-
cmp ecx,1
-
je bucla_mare
-
}
-
}
-
-
int maxim(int)
-
{
-
int v[12];
-
_asm
-
{
-
mov eax,[ebp+8]
-
cmp eax,10
-
jb exceptie
-
jmp continua
-
exceptie:
-
mov ecx,eax
-
jmp stop2
-
continua:
-
mov ebx,10
-
mov ecx,0
-
lea esi,v
-
add esi,4
-
bucla1:
-
mov edx,0
-
cmp eax,0
-
je stop1
-
div ebx
-
inc ecx
-
mov [esi],edx
-
add esi,4
-
jmp bucla1
-
stop1:
-
lea eax,v
-
mov [eax],ecx
-
push eax
-
call bubble_sort
-
add esp,4
-
-
mov ecx,0
-
mov eax,1
-
lea esi,v
-
mov ebx,[esi]
-
add esi,4
-
bucla2:
-
cmp ebx,0
-
je stop2
-
push ecx
-
mov ecx,[esi]
-
mov edx,0
-
push eax
-
mov edi,eax
-
mov eax,1
-
mul edi
-
mul ecx
-
pop edx
-
pop ecx
-
push edx
-
add ecx,eax
-
pop eax
-
mov edi,10
-
mul edi
-
dec ebx
-
add esi,4
-
jmp bucla2
-
stop2:
-
mov eax,ecx
-
}
-
}
-
-
int main()
-
{
-
int x;
-
cin>>x;
-
cout<<maxim(x)<<endl;
-
system("pause");
-
return 0;
-
}