Найти максимальный элемент в массиве и количество таких элементов - Assembler
Формулировка задачи:
Здравствуйте, первую часть задания сделал, но вот с второй не получается разобраться. Прошу помочь. На этом форуме уже находил похожее, но не смог понять. Хотелось бы увидеть на моем примере.
Вот код для поиска максимального элемента:
cseg segment 'code' assume cs:cseg, ds:dseg org 100h main proc mov ax, dseg ; указывает на регистр данных mov ds, ax ; указывает на регистр данных Xor si, si; инициализация счетчика mov cx, len_mas M1: mov bl, mas[si]; помещаем массив в bl cmp bl, max; сравниваем с 0 на 1 итерации JG I jmp kon I: mov max, bl kon: inc si loop M1 mov al, max Call Write Exit: mov ah, 04ch; выход из программы (функция DOS) mov al, 0h; код возврата int 21h; ret; возвращаем управление отладчику Write proc aam add ax, 3030h mov bx, ax mov ah, 02h mov dl, bh int 21h mov dl, bl int 21h ret Write ENDP main endp dseg segment mas db 10,98,99,20,21 len_mas = $-mas otr db 0 max db 0 incmax db 0 dseg ends cseg ends stk segment stack dw 256 dup (0) stk ends end main
Решение задачи: «Найти максимальный элемент в массиве и количество таких элементов»
textual
Листинг программы
.model small .stack 100h .data Mas db 8,9,3,1,10,5,10 len_mas = $-Mas max db 0 IncMax db 0 CRLf db 13, 10, '$' .code main proc mov ax, @data mov ds, ax cld lea si, Mas lodsb mov Max, al mov IncMax, 1 mov cx, len_mas dec cx @@ForI: lodsb cmp al, Max jng @@TestEqu mov Max, al mov IncMax, 0 @@TestEqu: cmp al, Max jne @@Continue inc IncMax @@Continue: loop @@ForI mov ah, 0 mov al, Max call Show_AX lea dx, CrLf mov ah, 9 int 21h mov ah, 0 mov al, IncMax call Show_AX mov ax, 4C00h int 21h main endp ; выводит число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе ; если число в ax отрицательное, то ;1) напечатать '-' ;2) сделать ax положительным or ax, ax jns @@Conv push ax mov dx, '-' mov ah, 2 ; ah - функция вывода символа на экран int 21h pop ax neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@Conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д