Advertisement
Guest User

Untitled

a guest
Feb 21st, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ormat PE console
  2. entry start
  3. include 'win32a.inc'
  4.  
  5. section '' code readable executable
  6.  
  7. mas1    dd 123456h,-123457h, 0, 1, -1, 346, 568, 9874
  8. N = ($-mas1)/4
  9. sMsg1   db 'mas=',0
  10. sMsg2   db 10,13,0
  11. sFmt1   db '%d ', 0
  12. cmd     db 'pause',0
  13.  
  14. start:
  15.         mov     esi, mas1
  16.         mov     edi, mas2
  17.         mov     ecx, N          ; количество копируемых элементов
  18.         rep movsd               ; скопировать массив из mas1 в mas2
  19.  
  20.         mov     esi, mas2
  21.         call    print           ; вывести массив
  22.  
  23.         mov     esi, mas2       ; адрес массива для обработки
  24.         stdcall qsort, 0, N-1   ; запустить рекурсивную процедуру
  25.                                 ; индексы сортировки от 0 до N-1
  26.  
  27.         call    print           ; вывести массив mas2
  28.         cinvoke system,cmd      ; подождать нажатия любой клавиши
  29.         invoke ExitProcess,0    ; завершить программу
  30.  
  31.  
  32. proc print
  33.         cinvoke printf,sMsg1
  34.         mov     bl, N
  35. m1:     lodsd
  36.         cinvoke printf,sFmt1,eax
  37.         dec     bl
  38.         jnz     m1
  39.         cinvoke printf,sMsg2
  40.         ret
  41. endp
  42.  
  43.  
  44. proc qsort stdcall L:DWORD,R:DWORD
  45.         mov     eax, [L]        ; левая граница
  46.         mov     ecx, eax
  47.         mov     ebx, [R]        ; правая граница
  48.         add     ecx, ebx
  49.         shr     ecx, 1
  50.         mov     ecx, [esi+4*ecx]
  51.  
  52.         cmp     eax, ebx
  53.         ja      end_while1
  54. begin_while1:
  55. loop_while2:
  56.         cmp     [esi+4*eax], ecx
  57.         jge     end_while2
  58.         inc     eax
  59.         jmp     loop_while2
  60. end_while2:
  61.  
  62. loop_while3:
  63.         cmp     [esi+4*ebx], ecx
  64.         jle     end_while3
  65.         dec     ebx
  66.         jmp     loop_while3
  67. end_while3:
  68.  
  69.         cmp     eax, ebx
  70.         ja      end_if1
  71.         jz      no_change
  72.         push    ecx
  73.         mov     ecx, [esi+4*eax]
  74.         mov     edx, [esi+4*ebx]
  75.         mov     [esi+4*eax], edx
  76.         mov     [esi+4*ebx], ecx
  77.         pop     ecx
  78. no_change:
  79.         inc     eax
  80.         dec     ebx
  81. end_if1:
  82.  
  83.         cmp     eax, ebx
  84.         jbe     begin_while1
  85. end_while1:
  86.  
  87.         cmp     [L], ebx
  88.         jae     end_if2
  89.         push    eax
  90.         stdcall qsort, [L], ebx
  91.         pop     eax
  92. end_if2:
  93.  
  94.         cmp     eax, [R]
  95.         jae     end_if3
  96.         stdcall qsort, eax, [R]
  97. end_if3:
  98.         ret
  99. endp
  100.  
  101. data import
  102. library kernel,'kernel32.dll',\
  103.         msvcrt,'msvcrt.dll'
  104.  
  105. import kernel,\
  106.        ExitProcess,'ExitProcess'
  107.  
  108. import msvcrt,\
  109.        printf,'printf',\
  110.        system,'system'
  111. end data
  112.  
  113. section '' readable writeable
  114. mas2    rd N
  115. blackdevill
  116. 0 / 0 / 0
  117. Регистрация: 28.05.2010
  118. Сообщений: 5
  119. 08.11.2010, 16:42  [ТС]     Быстрая сортировка   #3
  120. А если использовать tasm, какие-нибудь изменения будут?
  121. kidiam
  122. 21 / 21 / 2
  123. Регистрация: 12.07.2010
  124. Сообщений: 42
  125. 09.11.2010, 04:34     Быстрая сортировка   #4
  126. Да.
  127. В фасме чтобы обратиться к переменной необходимо написать её имя в квадратных скобках, а в тасме просто её имя.
  128. В фасме чтобы получить адресс переменной необходимо написать только имя, а в тасме перед именем переменной написать ключевое слово offset.
  129. В фасме определены макросы для вызова и задания функций, а в тасме таковых нет.
  130. Подключение библиотек и импорта также различны.
  131. Mikl___
  132. Заблокирован
  133. Автор FAQ
  134. 11.11.2010, 13:16     Быстрая сортировка   #5
  135. blackdevill, процедура qsort находится в ntdll.dll
  136. Код
  137. push    offset array+n*4-4;указатель на последний элемент
  138.         push    offset array;указатель на первый элемент массива
  139.         call    quick_sort      ; quicksort (data, data+n-1)
  140. ;-----------------------------------------------------
  141. partition proc    Lb:dword,    Ub:dword
  142. ; функция partition возвращает адрес pivot
  143.         mov edx,Ub
  144.        sub edx,eax             ;eax=Lb
  145.        shr edx,3             ;(Ub-Lb)/2
  146. ; После завершения этого цикла все значения слева от элемента pivot
  147. ; будут меньше значения элемента pivot, а все значения справа от
  148. ; элемента pivot будут больше, чем значение элемента pivot
  149.         mov edi,[eax+edx*4]   ;получаем указатель на pivot
  150. ;pivot = *(Lb+(Ub-Lb)/2)
  151.         cmp eax,Ub         ;eax=Lb
  152.         ja short b0             ;return Lb;
  153. ; Поиск значения, большего чем pivot, в нижней части массива
  154. b1:     mov eax,Lb        
  155.         cmp [eax],edi        ;edi=pivot
  156.         jnl short b3        ;while (*Lb < pivot)
  157.        add Lb,4            ;Lb++;  
  158.        jmp short b1
  159. ; Поиск значения, меньшего чем pivot, в верхней части массива
  160. b4:     sub Ub,4        
  161. b3:     mov eax,Ub
  162.         cmp [eax],edi        ;while (*Ub > pivot)
  163.         jg short b4             ;Ub--
  164.         mov ecx,Lb
  165.        cmp ecx,ea
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement