Поиск максимального значения в массиве - Assembler

Узнай цену своей работы

Формулировка задачи:

Вечер добрый, господа! Задача: поиск максимального элемента в массиве и вывод его. Знаю, что тема уже заезженная и много тем о ней, но код не работает) Я тут пробовал написать, но чет не очень у меня не шибко работает) Может кто поможет новичку исправить код? Использую FASM.
org 100H
 
  mov si, -1
  mov bl, 0      ; хранится значение max
 
start:
  inc si
  cmp si, 9
  je exit
 
  cmp [mas + si], bl
  jg zamena   ; если эл. массива больше регистра bl (max), то вызываем замену
  jmp start

exit:
  mov ah, 02h
  mov dl, bl       ; выводим наш максимальный эл
  int 21h
 
  mov ah, 0
  int 16h
 
  mov ax, 4C00h
  int 21h
  ret

zamena:
  mov bl, [mas + si]       ; заменяем bl(max) на эл. массива
  loop start

mas db 1,2,3,4,5,6,7,8,9,5

Решение задачи: «Поиск максимального значения в массиве»

textual
Листинг программы
org 100H
 
start:
  mov cx,10
  mov si,mas
  sub si,1
 
cicl:
  inc si
  mov al,byte [si]
  cmp al,ah
  ja cicl1
  jmp cicl2
 
cicl1:
  mov ah,al
 
cicl2:
  loop cicl
 
exit:
;max simvol of massive  ah
 
  mov dl,ah
  add dl,30h
 
  mov ah, 02h
  int 21h
 
  mov ah, 0
  int 16h
 
  mov ax,4C00h
  int 21h
 
 
 
mas db 1,2,3,4,5,6,7,8,9,5

Объяснение кода листинга программы

  1. org 100H — здесь задаётся базовый адрес для сегмента (100H), в данном случае — для сегмента данных.
  2. start: — здесь начинается выполнение программы.
  3. mov cx,10 — данная команда задаёт значение счётчика (cx), которое будет использоваться в цикле.
  4. mov si,mas — здесь в качестве регистра-индекса (si) используется значение начала массива (mas).
  5. sub si,1 — здесь уменьшается значение регистра-индекса (si) на единицу, так как счёт начинается с нуля.
  6. cicl: — здесь начинается цикл.
  7. inc si — увеличивается значение регистра-индекса (si) на единицу.
  8. mov al,byte [si] — в регистр (al) записывается значение байта, который находится по индексу (si) в массиве.
  9. cmp al,ah — сравниваются значения регистра (al) и аккумулятора (ah).
  10. ja cicl1 — если значение регистра (al) больше значения аккумулятора (ah), то происходит переход на метку cicl1.
  11. jmp cicl2 — в противном случае происходит переход на метку cicl2.
  12. cicl1: — здесь выполняются действия, которые будут выполняться при каждом превышении значения регистра (al) значения аккумулятора (ah).
  13. mov ah,al — значение регистра (al) копируется в аккумулятор (ah).
  14. cicl2: — здесь выполняются действия, которые будут выполняться после каждой итерации цикла.
  15. loop cicl — здесь происходит проверка условия цикла (cicl), и если оно истинно, то происходит переход на начало цикла (cicl).
  16. mov dl,ah — в регистр (dl) записывается значение аккумулятора (ah), которое содержит максимальное значение.
  17. add dl,30h — к значению регистра (dl) добавляется значение 30h, чтобы получить ASCII-код символа для максимального значения.
  18. mov ah, 02h — в регистр (ah) записывается значение 02h, которое используется для вывода ASCII-кода.
  19. int 21h — происходит ввод/вывод команды, которая выводит ASCII-код на экран.
  20. mov ah, 0 — в регистр (ah) записывается значение 0, которое используется для вывода символа новой строки.
  21. int 16h — происходит ввод/вывод команды, которая выводит символ новой строки на экран.
  22. mov ax,4C00h — в регистры (ax) записывается значение 4C00h, которое является кодом завершения работы программы.
  23. int 21h — происходит ввод/вывод команды, которая завершает работу программы. Таким образом, в данном коде выполняется поиск максимального значения в массиве, и выводится ASCII-код символа и само значение на экран.

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы