format pe console
section '.code' import readable writeable executable
include 'win32ax.inc'
library msvcrt, 'msvcrt.dll'
import msvcrt,\
printf, 'printf',\
getchar, 'getchar'
proc print, arr, n
locals
frmt_byte db '%d%s', 0
left_bracket db '[', 0
delim_comma db ', ', 0
right_bracket db ']', 13, 10, 0
endl
cinvoke printf, edx, addr left_bracket
mov esi, [arr]
xor ecx, ecx
@@: push ecx
mov edx, [n]
dec edx
cmp ecx, edx
jne .comma
lea edx, [right_bracket]
push edx
jmp .next
.comma:
lea edx, [delim_comma]
push edx
.next:
movzx eax, byte[esi]
cinvoke printf, addr frmt_byte, eax
add esp, 4
pop ecx
inc ecx
add esi, 4
cmp ecx, [n]
jne @b
ret
endp
proc qsort, arr, left, right
mov edx, [right]
mov ebx, [left]
mov edi, [arr]
@02:
mov ecx, ebx
lea eax, [edx + ebx]
mov esi, edx
mov eax, eax
test eax, eax
jns @03
add eax, 1
@03:
sar eax, 1
mov eax, dword[eax * 4 + edi]
jmp @05
@04:
inc ecx
@05:
cmp dword[ecx * 4 + edi], eax
jl @04
jmp @07
@06:
dec esi
@07:
cmp dword[esi * 4 + edi], eax
jg @06
cmp ecx, esi
jg @09
mov ebx, dword[ecx * 4 + edi]
mov dword[ebp + 8], ebx
mov ebx, dword[esi * 4 + edi]
cmp dword[ebp + 8], ebx
jle @08
mov dword[ecx * 4 + edi], ebx
mov ebx, dword[ebp + 8]
mov dword[esi * 4 + edi], ebx
@08:
inc ecx
dec esi
cmp ecx, esi
jle @05
@09:
mov ebx, dword[ebp + 12]
cmp ecx, edx
jge @10
stdcall qsort, edi, ecx, edx
@10:
cmp ebx, esi
jge @11
mov edx, esi
jmp @02
@11:
ret
endp
entry $
stdcall print, arr, arr_sz
stdcall qsort, arr, 0, arr_sz - 1
stdcall print, arr, arr_sz
cinvoke getchar
xor eax, eax
ret
arr dd 99, 88, 77, 66, 55, 44, 33, 22, 11
arr_sz = ($ - arr) / 4