Найти максимальный элемент в массиве и количество таких элементов - 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

Оцени полезность:

14   голосов , оценка 3.714 из 5
Похожие ответы