Найти два максимума в массиве - Assembler

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

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

Добрый день, Нужна помощь, не выходит сделать программу в эмуляторе 8086 Необходимо найти два максимума в массиве и переставить в обратном порядке элементы массива, находящиеся между этими максимумами.

Решение задачи: «Найти два максимума в массиве»

textual
Листинг программы
  1.         model   small
  2.         .stack  100h
  3.  
  4.         .data
  5.  
  6. len     equ     10
  7. mas     db      '1', '2', '9', '4', '5', '7', '8', '0', '2' ,'3', '$'
  8.  
  9.         .code
  10.  
  11. start:  mov     ax, @data
  12.         mov     ds, ax
  13.  
  14.         mov     cx, len ;Число элементов в массиве
  15.         xor     bx, bx  ;Индекс просматриваемого элемента изначально 0
  16.         xor     ah, ah  ;Значение предыдущего элемента изначально 0
  17.  
  18. cycl1:  mov     al, mas[bx]     ;Прочитали текущий элемент массива
  19.         xchg    al, ah          ;Поменяли местами текущий и предыдущий
  20.         cmp     ah, al          ;Сравниваем текущий с предыдущим
  21.         jb      next2           ;Переход если значения начали падать
  22.         mov     si, bx          ;Индекс левого максимума = Индекс текущего
  23.         inc     bx              ;Продвинули индекс массива
  24.         loop    cycl1
  25. next2:  jcxz    exit            ;Не нашли чего искали, выход из программы
  26. cycl2:  inc     bx              ;Продвинули индекс массива
  27.         mov     al, mas[bx]     ;Прочитали текущий элемент массива
  28.         xchg    al, ah          ;Поменяли местами текущий и предыдущий
  29.         cmp     ah, al          ;Сравниваем текущий с предыдущим
  30.         ja      next3           ;Переход если значения начали возрастать
  31.         loop    cycl2
  32. next3:  jcxz    exit            ;Не нашли чего искали, выход из программы
  33.         mov     di, bx          ;Индекс правого максимума = Индекс текущего
  34. cycl3:  inc     bx              ;Продвинули индекс массива
  35.         mov     al, mas[bx]     ;Прочитали текущий элемент массива
  36.         xchg    al, ah          ;Поменяли местами текущий и предыдущий
  37.         cmp     ah, al          ;Сравниваем текущий с предыдущим
  38.         jb      perest          ;Переход если значения начали падать
  39.         mov     di, bx          ;Индекс правого максимума = Индекс текущего
  40.         loop    cycl3
  41.  
  42. perest: ;Тут перестановка в диапазоне индексов si..di
  43.  
  44.         lea     dx, mas[si]     ;Адрес первого горба
  45.         mov     mas+1[di], '$'  ;Сразу за вторым горбом воткнем $
  46.         mov     ah, 9           ;Вывод массива строкой
  47.         int     21h
  48.  
  49. exit:   mov     ax, 4C00h
  50.         int     21h
  51.  
  52.         end     start

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

  1. В данной программе объявляются сегменты и выделяется память для данных и кода.
  2. Создается массив mas со значениями '1', '2', '9', '4', '5', '7', '8', '0', '2', '3', '$'.
  3. В начале кода происходит инициализация регистров сегмента данных и регистра DS.
  4. Затем загружается значение len (10) в регистр CX и устанавливается начальное значение индекса bx в 0.
  5. Далее начинается цикл cycl1, в котором происходит сравнение текущего значения с предыдущим и находится индекс левого максимума.
  6. После этого идет цикл cycl2, в котором находится индекс правого максимума.
  7. В конце программы происходит проверка на наличие максимумов и их перестановка, если нужно, а затем вывод результата.
  8. По завершению работы программа выполняет завершение работы с помощью команды int 21h.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы