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