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
los parametros se pasan por la pila
y son asi
quicksort(int *vector, int izq, int der)
			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

Código (asm) [Seleccionar] 
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)

