Вывод элементов, находящихся после максимального элемента в массиве - Assembler
Формулировка задачи:
Требуется помощь начинающему программисту в ассемблере.
Задание:
Дан одномерный массив, вывести элементы, находящиеся после максимального элемента.
Примерно как должен выглядеть код:masm model small .stack 256 .data a dw ? b dw ? c dw ? h dw ? .code .startup jmp main include io1.inc main: call Procinint mov a, ax call Procinint mov b, ax call Procinint mov c, ax mov ax,c mov bx,b imul bx mov h,ax mov ax,a add ax,b mov b,ax mov ax,h div b mov dh, 1 mov dl, 5 call procoutnum .exit end
Заранее спасибо!!!
Решение задачи: «Вывод элементов, находящихся после максимального элемента в массиве»
textual
Листинг программы
masm model small .stack 256 .data Mosiv dw 45, 65, 78, 88, 10, 555, 12, 45, 88, 97, 100 dlena dw ($-Mosiv)/2 .code .startup jmp main include io1.inc main: mov ax, mosiv mov dh, 0 mov dl, 5 call procoutnum lea si, [Mosiv] mov cx, [dlena] mov di, si mov ax, [si] mov bx, cx @@ForMax: cmp ax, [si] jle @@Next mov di, si mov ax, [si] mov bx, cx @@Next: add si, 2 loop @@ForMax mov cx, bx dec cx mov si, di add si, 2 jcxz @@Exit @@ForOut: mov ax, [si] call procoutnum add si, 2 loop @@ForOut @@Exit: .exit end
Объяснение кода листинга программы
- Объявляются переменные:
Mosiv
- массив чисел [45, 65, 78, 88, 10, 555, 12, 45, 88, 97, 100],dlena
- длина массиваMosiv
в байтах.
- Инициализируется программа и переход на метку
main
. - Выводится содержимое переменной
Mosiv
. - Устанавливаются значения регистров:
ax
получает значение переменнойMosiv
,dh
устанавливается в 0,dl
устанавливается в 5.
- Вызывается подпрограмма
procoutnum
. - Загружается адрес массива
Mosiv
в регистрsi
. - Загружается длина массива
Mosiv
в регистрcx
. - Копируются значения регистров
si
иdi
. - Загружается значение первого элемента массива в регистр
ax
и значение длины массива в регистрbx
. - Начинается цикл
ForMax
. - Сравнивается значение регистра
ax
с текущим элементом массива. - Если текущий элемент массива меньше или равен значению регистра
ax
, выполняется переход к меткеNext
. - Иначе, обновляются значения регистров
di
(хранит адрес максимального элемента) иax
(хранит значение максимального элемента). - Обновляются значения регистра
si
(указывает на следующий элемент массива) и регистраcx
(количество оставшихся элементов). - Проверяется условие окончания цикла
ForMax
. - Если условие не выполняется, выполняется переход к метке
Exit
. - Устанавливается значение регистра
cx
равным значению регистраbx
(количество элементов массива - 1). - Уменьшается значение регистра
cx
на 1. - Копируется значение регистра
di
в регистрsi
(указывает на элемент после максимального элемента). - Увеличивается значение регистра
si
на 2 (размер элемента массива). - Проверяется условие окончания цикла
ForOut
. - Выводится текущий элемент массива с помощью подпрограммы
procoutnum
. - Увеличивается значение регистра
si
на 2 (размер элемента массива). - Проверяется условие окончания цикла
ForOut
. - Если условие выполняется, выполняется переход к метке
Exit
. - Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д