Advertisement
dxvmxnd

Untitled

May 22nd, 2024
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. org 100h
  2.  
  3. start:
  4. ; Инициализация массива
  5. array db 5, 12, 7, 3, 14, 8, 1, 0
  6.  
  7. mov si, array ; Установить указатель на начало массива
  8.  
  9. ; Инициализация переменных для хранения индексов и значений макс. и мин. элементов
  10. mov bl, [si] ; BL = первый элемент массива
  11. mov bh, [si] ; BH = первый элемент массива
  12. mov di, si ; DI = указатель на макс. элемент
  13. mov bx, si ; BX = указатель на мин. элемент (используем BX как адресный регистр)
  14.  
  15. find_max_min:
  16. inc si ; Переход к следующему элементу массива
  17. mov al, [si] ; Загрузка элемента массива в AL
  18. test al, al ; Проверка на конец массива
  19. jz print_done ; Если конец массива, завершаем программу
  20.  
  21. ; Проверка на максимальный элемент
  22. cmp al, bl
  23. jle .check_min
  24. mov bl, al
  25. mov di, si
  26.  
  27. .check_min:
  28. ; Проверка на минимальный элемент
  29. cmp al, bh
  30. jge find_max_min
  31. mov bh, al
  32. mov bx, si
  33. jmp find_max_min
  34.  
  35. print_done:
  36. call print_array ; Выводим массив
  37. call print_done_message ; Выводим сообщение "Done"
  38. jmp exit_program ; Завершаем программу
  39.  
  40. print_array:
  41. mov si, array
  42.  
  43. print_loop:
  44. mov al, [si]
  45. test al, al ; Проверка на конец массива
  46. jz done_printing ; Если конец массива, завершаем вывод
  47.  
  48. call hex2asc ; Преобразование числа в ASCII
  49. mov ah, 02h ; Функция вывода символа на экран
  50. int 21h ; Вызов DOS прерывания
  51.  
  52. mov al, ' ' ; Вывод пробела
  53. int 21h ; Вызов DOS прерывания
  54.  
  55. inc si ; Переход к следующему элементу
  56. jmp print_loop
  57.  
  58. done_printing:
  59. ret
  60.  
  61. print_done_message:
  62. mov ah, 09h ; Функция вывода строки
  63. lea dx, [done_msg] ; Загрузка адреса сообщения
  64. int 21h ; Вызов DOS прерывания
  65. ret
  66.  
  67. exit_program:
  68. mov ax, 4C00h ; Завершение программы
  69. int 21h ; Вызов DOS прерывания
  70.  
  71. hex2asc:
  72. pusha ; Сохраняем значения регистров
  73. xor cx, cx ; Обнуляем счетчик cx
  74. mov ax, bx ; Перемещаем значение из bx в ax
  75. mov bx, 10 ; Перемещаем основание 10 в bx
  76.  
  77. next_digit:
  78. xor dx, dx ; Очищаем dx перед делением
  79. div bx ; Делим ax на 10, результат в al, остаток в dx
  80. add dl, '0' ; Преобразуем остаток в ASCII
  81. push dx ; Сохраняем ASCII символ в стеке
  82. inc cx ; Увеличиваем счетчик цифр
  83.  
  84. test ax, ax ; Проверяем, было ли деление полным
  85. jnz next_digit ; Если нет, продолжаем
  86.  
  87. print_digits:
  88. pop dx ; Восстанавливаем ASCII символ из стека
  89. mov ah, 02h ; Функция вывода символа на экран
  90. int 21h ; Вызов DOS прерывания
  91. loop print_digits ; Повторяем для всех цифр
  92. popa ; Восстанавливаем значения регистров
  93. ret
  94.  
  95. done_msg db 'Done', 0 ; Убран символ '$'
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement