Найти два максимума в массиве - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д