Advertisement
qberik

Untitled

Dec 26th, 2022 (edited)
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1. .model small
  2. .stack 100h
  3.  
  4.  
  5.  
  6. ; МАКСРОСЫ ИЗ МЕТОДИЧКИ
  7. ;------------------------------макрос ввода значений
  8. mReadAX MACRO buf, sz
  9. local input, startOfConvert, endofConvert
  10. push bx
  11. push cx
  12. push dx
  13.  
  14. input:
  15. mov [buf], sz
  16. mov dx, offset [buf]
  17. mov ah, 0ah
  18. int 21h
  19.  
  20. mov ah, 02h
  21. mov dl, 0Dh
  22. int 21h
  23.  
  24. mov ah, 02h
  25. mov dl, 0Ah
  26. int 21h
  27.  
  28. xor ah, ah
  29. cmp ah, [buf][1]
  30. jz input
  31.  
  32. xor cx, cx
  33. mov cl, [buf][1]
  34.  
  35. xor ax, ax
  36. xor bx, bx
  37. xor dx, dx
  38. mov bx, offset [buf][2]
  39.  
  40. cmp [buf][2], "-"
  41. jne startOfConvert
  42. inc bx
  43. dec cl
  44.  
  45. startOfConvert:
  46. mov dx, 10
  47. mul dx
  48. cmp ax, 8000h
  49. jae input
  50.  
  51. mov dl, [bx]
  52. sub dl, "0"
  53.  
  54. add ax, dx
  55. cmp ax, 8000h
  56. jae input
  57.  
  58. inc bx
  59. loop startOfConvert
  60.  
  61. cmp [buf][2], "-"
  62. jne endofConvert
  63. neg ax
  64.  
  65. endofConvert:
  66. pop dx
  67. pop cx
  68. pop bx
  69.  
  70. endm mReadAX
  71.  
  72.  
  73.  
  74. ;------------------------------макрос вывода сообщений на экран
  75. Print MACRO str
  76. push ax
  77. push dx
  78.  
  79. mov ah, 09h
  80. mov dx, offset str
  81. int 21h
  82.  
  83. pop dx
  84. pop ax
  85. ENDM Print
  86.  
  87. ;------------------------------макрос вывода результата
  88. mWriteAx macro
  89. local convert, write
  90. push ax
  91. push bx
  92. push cx
  93. push dx
  94. push di
  95.  
  96. mov cx, 10
  97. xor di, di
  98.  
  99. or ax, ax
  100. jns convert
  101.  
  102. push ax
  103. mov dx, "-"
  104. mov ah, 02h
  105. int 21h
  106.  
  107. pop ax
  108. neg ax
  109.  
  110. convert:
  111. xor dx, dx
  112. div cx
  113. add dl, "0"
  114. inc di
  115. push dx
  116. or ax, ax
  117. jnz convert
  118.  
  119. write:
  120. pop dx
  121. mov ah, 02h
  122. int 21h
  123. dec di
  124. jnz write
  125.  
  126. pop di
  127. pop dx
  128. pop cx
  129. pop bx
  130. pop ax
  131.  
  132. endm mWriteAx
  133.  
  134.  
  135.  
  136. .data
  137.  
  138. text_in_N db "Input N: $"
  139. text_in_arr db "Input array elems",13,10,"$"
  140. text_print_sum db "Sum of negative $"
  141.  
  142. N dw ?
  143.  
  144. arr dw 100 dup(?) ; массив
  145.  
  146. len_arr dw 0 ; длинна массива
  147.  
  148. _arr dw 100 dup(?) ; массив отрицательных
  149. _len_arr dw 0 ; длинна массива отрицательных
  150.  
  151. min_neg_elem dw ? ; минимальное отрицательное число
  152. min_neg_elem_pos dw ? ; позиция минимального отрицательного числа
  153.  
  154. buf db 10 dup(?) ; буфер для ввода
  155.  
  156. .code
  157. start:
  158. mov ax, @data
  159. mov ds, ax
  160.  
  161. ; считываем N
  162. Print text_in_N
  163. mReadAX buf, 5
  164. mov N, ax
  165.  
  166. ; считываем массив
  167. mov bx, offset arr
  168. mov cx, N
  169. Print text_in_arr
  170. _read_array:
  171. mReadAX buf, 5
  172. mov [bx], ax
  173. add bx, 2
  174. loop _read_array
  175.  
  176.  
  177. ; копируем отрицательные числа
  178. mov bx, offset arr
  179. mov si, offset _arr
  180. mov cx, N
  181. mov dx, 0 ; счётчик отрицательных
  182. _copy_neg_elem:
  183.  
  184. mov ax, [bx]
  185. add bx, 2
  186.  
  187. cmp ax, 0
  188. jge _copy_neg ; ax >= 0
  189. ; ax < 0
  190. mov [si], ax
  191. add si, 2
  192. inc dx
  193. mov _len_arr, dx
  194.  
  195. _copy_neg:
  196.  
  197. cmp dx, 5 ; если прочитано 5 или больше
  198. jge _end_copy_neg_elem ; уходим
  199.  
  200. loop _copy_neg_elem
  201. _end_copy_neg_elem:
  202.  
  203. ; находим минимальный элемент
  204. mov bx, offset _arr
  205. mov cx, _len_arr
  206. mov ax, [bx]
  207. mov min_neg_elem_pos, bx
  208. ; пропускаем поиск, если нет элементов
  209. cmp cx, 0
  210. jle _end_find_min_elem
  211. _find_min_elem:
  212.  
  213. cmp ax, [bx]
  214. jle _not_min
  215. ; если число меньше минимума
  216. mov ax, [bx] ; запоминаем его
  217. mov min_neg_elem, ax ; запоминаем его
  218. mov min_neg_elem_pos, bx ; и его прозицию
  219. _not_min:
  220.  
  221. add bx, 2
  222. loop _find_min_elem
  223. _end_find_min_elem:
  224.  
  225.  
  226. ; считаем сумму
  227. mov si, min_neg_elem_pos
  228. mov bx, offset _arr
  229. mov cx, _len_arr
  230. mov ax, 0
  231. ; пропускаем вывод, если нет элементов
  232. cmp cx, 0
  233. jle _end_sum_neg
  234. _sum_neg:
  235.  
  236. cmp bx, si
  237. je _skip_sum
  238. add ax, [bx]
  239.  
  240. _skip_sum:
  241. add bx, 2
  242. loop _sum_neg
  243. _end_sum_neg:
  244.  
  245.  
  246. Print text_print_sum
  247. mWriteAx
  248.  
  249. mov ax, 4c00h
  250. int 21h
  251.  
  252.  
  253. end start
  254.  
  255.  
  256.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement