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