Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ormat PE console
- entry start
- include 'win32a.inc'
- section '' code readable executable
- mas1 dd 123456h,-123457h, 0, 1, -1, 346, 568, 9874
- N = ($-mas1)/4
- sMsg1 db 'mas=',0
- sMsg2 db 10,13,0
- sFmt1 db '%d ', 0
- cmd db 'pause',0
- start:
- mov esi, mas1
- mov edi, mas2
- mov ecx, N ; количество копируемых элементов
- rep movsd ; скопировать массив из mas1 в mas2
- mov esi, mas2
- call print ; вывести массив
- mov esi, mas2 ; адрес массива для обработки
- stdcall qsort, 0, N-1 ; запустить рекурсивную процедуру
- ; индексы сортировки от 0 до N-1
- call print ; вывести массив mas2
- cinvoke system,cmd ; подождать нажатия любой клавиши
- invoke ExitProcess,0 ; завершить программу
- proc print
- cinvoke printf,sMsg1
- mov bl, N
- m1: lodsd
- cinvoke printf,sFmt1,eax
- dec bl
- jnz m1
- cinvoke printf,sMsg2
- ret
- endp
- proc qsort stdcall L:DWORD,R:DWORD
- mov eax, [L] ; левая граница
- mov ecx, eax
- mov ebx, [R] ; правая граница
- add ecx, ebx
- shr ecx, 1
- mov ecx, [esi+4*ecx]
- cmp eax, ebx
- ja end_while1
- begin_while1:
- loop_while2:
- cmp [esi+4*eax], ecx
- jge end_while2
- inc eax
- jmp loop_while2
- end_while2:
- loop_while3:
- cmp [esi+4*ebx], ecx
- jle end_while3
- dec ebx
- jmp loop_while3
- end_while3:
- cmp eax, ebx
- ja end_if1
- jz no_change
- push ecx
- mov ecx, [esi+4*eax]
- mov edx, [esi+4*ebx]
- mov [esi+4*eax], edx
- mov [esi+4*ebx], ecx
- pop ecx
- no_change:
- inc eax
- dec ebx
- end_if1:
- cmp eax, ebx
- jbe begin_while1
- end_while1:
- cmp [L], ebx
- jae end_if2
- push eax
- stdcall qsort, [L], ebx
- pop eax
- end_if2:
- cmp eax, [R]
- jae end_if3
- stdcall qsort, eax, [R]
- end_if3:
- ret
- endp
- data import
- library kernel,'kernel32.dll',\
- msvcrt,'msvcrt.dll'
- import kernel,\
- ExitProcess,'ExitProcess'
- import msvcrt,\
- printf,'printf',\
- system,'system'
- end data
- section '' readable writeable
- mas2 rd N
- blackdevill
- 0 / 0 / 0
- Регистрация: 28.05.2010
- Сообщений: 5
- 08.11.2010, 16:42 [ТС] Быстрая сортировка #3
- А если использовать tasm, какие-нибудь изменения будут?
- kidiam
- 21 / 21 / 2
- Регистрация: 12.07.2010
- Сообщений: 42
- 09.11.2010, 04:34 Быстрая сортировка #4
- Да.
- В фасме чтобы обратиться к переменной необходимо написать её имя в квадратных скобках, а в тасме просто её имя.
- В фасме чтобы получить адресс переменной необходимо написать только имя, а в тасме перед именем переменной написать ключевое слово offset.
- В фасме определены макросы для вызова и задания функций, а в тасме таковых нет.
- Подключение библиотек и импорта также различны.
- Mikl___
- Заблокирован
- Автор FAQ
- 11.11.2010, 13:16 Быстрая сортировка #5
- blackdevill, процедура qsort находится в ntdll.dll
- Код
- push offset array+n*4-4;указатель на последний элемент
- push offset array;указатель на первый элемент массива
- call quick_sort ; quicksort (data, data+n-1)
- ;-----------------------------------------------------
- partition proc Lb:dword, Ub:dword
- ; функция partition возвращает адрес pivot
- mov edx,Ub
- sub edx,eax ;eax=Lb
- shr edx,3 ;(Ub-Lb)/2
- ; После завершения этого цикла все значения слева от элемента pivot
- ; будут меньше значения элемента pivot, а все значения справа от
- ; элемента pivot будут больше, чем значение элемента pivot
- mov edi,[eax+edx*4] ;получаем указатель на pivot
- ;pivot = *(Lb+(Ub-Lb)/2)
- cmp eax,Ub ;eax=Lb
- ja short b0 ;return Lb;
- ; Поиск значения, большего чем pivot, в нижней части массива
- b1: mov eax,Lb
- cmp [eax],edi ;edi=pivot
- jnl short b3 ;while (*Lb < pivot)
- add Lb,4 ;Lb++;
- jmp short b1
- ; Поиск значения, меньшего чем pivot, в верхней части массива
- b4: sub Ub,4
- b3: mov eax,Ub
- cmp [eax],edi ;while (*Ub > pivot)
- jg short b4 ;Ub--
- mov ecx,Lb
- cmp ecx,ea
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement