Autor
|
Tema: [ASM]Algoritmo de Ordenacion Quicksort (Leído 12,795 veces)
|
ny0x
Desconectado
Mensajes: 336
|
Bueno aqui les dejo una traduccion a ensamblador del algoritmo de QuickSort me costo algo de trabajo y estuve un buen depurando pero por fin salio. Lo malo es que solo funciona con numeros de 32 bits positivos pero se puede arreglar para que funcionen con bytes y words (ahora lo de negativos no se intente cambiar jl y jg por jb y ja pero me los pone como mayores que cualquier positivo) Si de casualidad alguien no entiende el codigo que me diga y le pongo comentarios format pe console include '\fasm\include\win32ax.inc' entry start .data vector dd 32,9,11,5,99,3,1,2,5,12,100,4365 formato db '%i %i %i %i %i %i %i %i %i %i %i %i',13,10,0 .code start: call Dump push 11 push 0 push vector call quicksort call Dump ret quicksort: push ebp mov ebp,esp push esi push ebx push ecx push edx mov ebx,dword[ebp + 12] mov ecx,dword[ebp + 16] cdq mov eax, ebx add eax, ecx push ecx mov ecx,2 div ecx pop ecx xchg edx,eax mov esi, [ebp + 8] mov edx,dword[esi + edx * 4] qs@L1: qs@L1@L1: cmp dword[esi + ebx * 4],edx jge qs@L1@L1@out inc ebx jmp qs@L1@L1 qs@L1@L1@out: qs@L1@L2: cmp dword[esi + ecx * 4],edx jle qs@L1@L2@out dec ecx jmp qs@L1@L2 qs@L1@L2@out: qs@L1@IF1: cmp ebx, ecx jg qs@L1@IF1@out mov eax, dword[esi + ebx * 4] xchg eax, dword[esi + ecx * 4] mov dword[esi + ebx * 4], eax inc ebx dec ecx qs@L1@IF1@out: cmp ebx,ecx jle qs@L1 qs@L1@out: qs@IF1: cmp dword[ebp + 12],ecx jge qs@IF1@out push ecx push dword[ebp + 12] push esi call quicksort qs@IF1@out: qs@IF2: cmp ebx, dword[ebp + 16] jge qs@IF2@out push dword[ebp + 16] push ebx push esi call quicksort qs@IF2@out: pop edx pop ecx pop ebx pop esi pop ebp retn 12 Dump: pushad mov edi,vector push dword[edi + 11 * 4] push dword[edi + 10 *4 ] push dword[edi + 9 * 4] push dword[edi + 8 * 4] push dword[edi + 7 * 4] push dword[edi + 6 * 4] push dword[edi + 5 * 4] push dword[edi + 4 * 4] push dword[edi + 3 * 4] push dword[edi + 2 * 4] push dword[edi + 1 * 4] push dword[edi] push formato call [printf] add esp,52 popad ret section '.idata' import data readable library msvc,'msvcrt.dll' import msvc,printf,'printf'
los parametros se pasan por la pila y son asi quicksort(int *vector, int izq, int der)
|
|
|
En línea
|
|
|
|
h0oke
Desconectado
Mensajes: 2.059
Coder ~
|
Exelente trabajo x0ʎu se nota que estas progresando bastante. Ya tendré mi tiempito para dedicarme a asm. S2!
|
|
|
En línea
|
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 361
|
gran trabajo de traducción amigo.
saludos Arkangel
|
|
|
En línea
|
|
|
|
YST
Desconectado
Mensajes: 965
I'm you
|
Muy buen code , para que sea compatible con byte y word se podria usar cbw y cwd solo es una idea para alguien que lo quiera usar. Por si alguien no conoce de que trata el algoritmo http://es.wikipedia.org/wiki/Quicksort
|
|
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
ny0x
Desconectado
Mensajes: 336
|
gracias tarde mucho depurando pero por lo menos quedo mas o menos decente P.D si no quieren que les cause un error cuando tienen un numero negativo cambien los saltos jl y jg por jb y ja, lo unico malo es que los negativos los ordenara como mayores Yst si se que se puede y tambien se puede adaptar para que ordene qwords
|
|
|
En línea
|
|
|
|
|
|
Yurix
Desconectado
Mensajes: 72
Paz para la guerra y guerra por la paz
|
Bravo , según he leído en el foro este algoritmo es el mas rápido , felicidades poco a poco vamos ampliando el repertorio y compartiendo , felicidades , te invito a que lo publiques en la wikipedia , si lo deseas lo puedo hacer yo. Saludos
|
|
|
En línea
|
|
|
|
YST
Desconectado
Mensajes: 965
I'm you
|
Basado en el Ordenamiento por Selecciónhice un codigo para ordenar bytes Este metodo tambien sirve para hacer un orden alfabetico ya que los caracteres ascii estan en orden alfabetico include 'win32ax.inc' .data cc db '774422990',0 .code start: invoke lstrlen,cc stdcall Ordenar,cc,eax invoke MessageBox,0,cc,0,0 invoke ExitProcess,0 proc Ordenar,cNumer,cCantidad pushad pushf mov edi,[cCantidad] mov ebx,[cNumer] dec ebx inc edi .bucle: dec edi inc ebx stdcall Menor,ebx,edi mov cl,byte[ebx] mov byte[ebx],al mov byte[edx],cl cmp edi,1 jne .bucle popf popad ret endp ;Función que retorna el byte menor en al y su posicion en edx proc Menor,cNumer,cCantidad push ecx mov eax,[cNumer] mov edx,eax mov ch,byte[eax] dec eax .bucle: dec [cCantidad] inc eax .if byte[eax] < ch mov ch,byte[eax] mov edx,eax .endif cmp [cCantidad] ,0 jne .bucle mov eax, [cNumer] mov al,ch pop ecx ret endp .end start
|
|
« Última modificación: 27 Junio 2009, 06:38 am por YST »
|
En línea
|
Yo le enseñe a Kayser a usar objetos en ASM
|
|
|
ny0x
Desconectado
Mensajes: 336
|
bien ya tenemos dos algoritmos de ordenacion Yurix publicalo si quieres pero no creo que se gane nada con ponerlo en wikipedia
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Reto Batch]Algoritmo Quicksort
Scripting
|
Binary_Death
|
3
|
3,950
|
23 Julio 2012, 02:10 am
por AgnesBlack
|
|
|
Problemas al intentar hacer mas eficiente un algoritmo de ordenacion
« 1 2 »
Programación C/C++
|
Dark00
|
10
|
5,856
|
14 Noviembre 2012, 23:24 pm
por Dark00
|
|
|
Algoritmo de ordenación.
Programación C/C++
|
Leafar77
|
1
|
2,004
|
11 Marzo 2015, 17:16 pm
por NOIS
|
|
|
Ayuda algoritmo de ordenacion
Programación C/C++
|
0and6
|
2
|
2,109
|
1 Agosto 2015, 07:27 am
por 0and6
|
|
|
Algoritmo Quicksort aplicado a una QTableWidget en Qt Creator
Programación C/C++
|
josemanuelbarajas998
|
2
|
2,504
|
16 Septiembre 2017, 22:34 pm
por josemanuelbarajas998
|
|