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

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

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

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

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

textual
Листинг программы
        model   small
        .stack  100h
 
        .data
 
len     equ     10
mas     db      '1', '2', '9', '4', '5', '7', '8', '0', '2' ,'3', '$'
 
        .code
 
start:  mov     ax, @data
        mov     ds, ax
 
        mov     cx, len ;Число элементов в массиве
        xor     bx, bx  ;Индекс просматриваемого элемента изначально 0
        xor     ah, ah  ;Значение предыдущего элемента изначально 0
 
cycl1:  mov     al, mas[bx]     ;Прочитали текущий элемент массива
        xchg    al, ah          ;Поменяли местами текущий и предыдущий
        cmp     ah, al          ;Сравниваем текущий с предыдущим
        jb      next2           ;Переход если значения начали падать
        mov     si, bx          ;Индекс левого максимума = Индекс текущего
        inc     bx              ;Продвинули индекс массива
        loop    cycl1
next2:  jcxz    exit            ;Не нашли чего искали, выход из программы
cycl2:  inc     bx              ;Продвинули индекс массива
        mov     al, mas[bx]     ;Прочитали текущий элемент массива
        xchg    al, ah          ;Поменяли местами текущий и предыдущий
        cmp     ah, al          ;Сравниваем текущий с предыдущим
        ja      next3           ;Переход если значения начали возрастать
        loop    cycl2
next3:  jcxz    exit            ;Не нашли чего искали, выход из программы
        mov     di, bx          ;Индекс правого максимума = Индекс текущего
cycl3:  inc     bx              ;Продвинули индекс массива
        mov     al, mas[bx]     ;Прочитали текущий элемент массива
        xchg    al, ah          ;Поменяли местами текущий и предыдущий
        cmp     ah, al          ;Сравниваем текущий с предыдущим
        jb      perest          ;Переход если значения начали падать
        mov     di, bx          ;Индекс правого максимума = Индекс текущего
        loop    cycl3
 
perest: ;Тут перестановка в диапазоне индексов si..di
 
        lea     dx, mas[si]     ;Адрес первого горба
        mov     mas+1[di], '$'  ;Сразу за вторым горбом воткнем $
        mov     ah, 9           ;Вывод массива строкой
        int     21h
 
exit:   mov     ax, 4C00h
        int     21h
 
        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
Похожие ответы