Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. assume cs: cseg, ds: dseg, ss: sseg
  2.  
  3. sseg segment stack
  4. db 256 dup (?)
  5. sseg ends
  6.  
  7. dseg segment
  8. arr dw 1, -9, 7, 6
  9. N dw ($-arr)/type arr
  10. dseg ends
  11.  
  12. cseg segment
  13.  
  14. OutInt proc
  15. push bp
  16. mov bp, sp
  17.  
  18. push ax
  19. push bx
  20. push cx
  21. push dx
  22. ; Проверяем число на знак.
  23. mov ax, [bp+4]
  24. test ax, ax
  25. jns oi1
  26.  
  27. ; Если оно отрицательное, выведем минус и оставим его модуль.
  28. mov cx, ax
  29. mov ah, 02h
  30. mov dl, '-'
  31. int 21h
  32. mov ax, cx
  33. neg ax
  34. ; Количество цифр будем держать в CX.
  35. oi1:
  36. xor cx, cx
  37. mov bx, 10
  38. oi2:
  39. xor dx,dx
  40. div bx
  41. ; Делим число на основание сс. В остатке получается последняя цифра.
  42. ; Сразу выводить её нельзя, поэтому сохраним её в стэке.
  43. push dx
  44. inc cx
  45. ; А с частным повторяем то же самое, отделяя от него очередную
  46. ; цифру справа, пока не останется ноль, что значит, что дальше
  47. ; слева только нули.
  48. test ax, ax
  49. jnz oi2
  50. ; Теперь приступим к выводу.
  51. mov ah, 02h
  52. oi3:
  53. pop dx
  54. ; Извлекаем очередную цифру, переводим её в символ и выводим.
  55. add dl, '0'
  56. int 21h
  57. ; Повторим ровно столько раз, сколько цифр насчитали.
  58. loop oi3
  59.  
  60. pop dx
  61. pop cx
  62. pop bx
  63. pop ax
  64.  
  65. pop bp
  66. ret 2
  67. OutInt endp
  68.  
  69. ; +8h: right
  70. ; +6h: left
  71. ; +4h: arr
  72. qsort proc
  73. push bp ;бп - для абсолютной адресации
  74. mov bp, sp
  75.  
  76. push ax
  77. push bx
  78. push cx
  79. push dx
  80. push si
  81.  
  82. mov ax, [bp+6] ; левая граница
  83. mov bx, [bp+8] ; правая граница
  84.  
  85. ; cx = arr[(left + right) / 2]
  86. mov si, ax
  87. add si, bx
  88. add si, [bp+4]
  89. mov cx, [si]
  90.  
  91. ;if ax>bx:
  92. ; end_while1
  93. cmp ax, bx
  94. ; ja - это для безнаковых
  95. ja end_while1 ; если левая больше правой то выход1
  96. begin_while1:
  97. loop_while2:
  98. ;if arr[first]>=arr[avg]:
  99. ; end_while2
  100. ;ax=ax+1 => first++
  101. ;loop_while2
  102.  
  103. mov si, ax
  104. shl si, 1
  105. add si, [bp+4]
  106. cmp [si], cx ;сравниваем первый элемент и средний со знаком
  107. jge end_while2
  108. inc ax
  109. jmp loop_while2
  110. end_while2:
  111.  
  112. loop_while3:
  113.  
  114. ;if arr[last]<=arr[avg]:
  115. ; end_while3
  116. ;bx=bx-1 => last++
  117. ;loop_while3
  118.  
  119. mov si, bx
  120. shl si, 1
  121. add si, [bp+4]
  122. cmp [si], cx
  123. jle end_while3
  124. dec bx
  125. jmp loop_while3
  126. end_while3:
  127. ;if first>last:
  128. ; end_if1
  129. ;if first==last:
  130. ; no_change
  131.  
  132. cmp ax, bx
  133. ja end_if1
  134. jz no_change
  135.  
  136. ; if first<last:
  137. ; swap(arr[first], arr[last])
  138. push cx
  139.  
  140. ; cx = arr[ax]
  141. mov si, ax
  142. shl si, 1
  143. add si, [bp+6]
  144. mov cx, [si]
  145. push si
  146.  
  147. ; dx = arr[bx]
  148. mov si, bx
  149. shl si, 1
  150. add si, [bp+6]
  151. mov dx, [si]
  152.  
  153. ; swap(arr[bx], arr[ax])
  154. mov [si], cx
  155. pop si
  156. mov [si], dx
  157.  
  158. pop cx
  159. no_change:
  160. inc ax
  161. dec bx
  162. end_if1:
  163. ;if first<=last:
  164. ; begin_while1
  165. cmp ax, bx
  166. jbe begin_while1
  167. end_while1:
  168.  
  169.  
  170. ;if left>=bx:
  171. ; end_if2
  172. cmp [bp+6h], bx
  173. jae end_if2
  174.  
  175. push bx
  176. push [bp+6h]
  177. push [bp+4h]
  178. call qsort
  179.  
  180. end_if2:
  181. ; if ax>=right:
  182. ; end_if3
  183. cmp ax, [bp+8h]
  184. jae end_if3
  185.  
  186. push [bp+8h]
  187. push ax
  188. push [bp+4h]
  189. call qsort
  190. end_if3:
  191.  
  192. pop si
  193. pop dx
  194. pop cx
  195. pop bx
  196. pop ax
  197.  
  198. pop bp
  199. ret 6
  200. endp
  201.  
  202. start:
  203. mov ax,dseg
  204. mov ds, ax
  205.  
  206. push N-1
  207. push 0
  208. push arr
  209. call qsort
  210.  
  211. mov cx, N
  212. mov si, arr
  213. cycle:
  214. push [si]
  215. call OutInt
  216. add si, 2
  217. loop cycle
  218.  
  219. mov ax,4c00h
  220. int 21h
  221. cseg ends
  222. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement