Написать и протестировать функцию, подсчитывающую количество минимальных элементов в целочисленной матрице - Assembler
Формулировка задачи:
Написать и протестировать функцию, подсчитывающую количество минимальных
элементов в целочисленной матрице. на языке Ассемблер заранее благодарю
Решение задачи: «Написать и протестировать функцию, подсчитывающую количество минимальных элементов в целочисленной матрице»
textual
Листинг программы
@stack segment para stack db 1024 dup(?) @stack ends @data segment N dw 5 M dw 8 Matrix dw 61,-69, 37,-17,-59,-90, 73, 30 dw 83,-82,-34,-17,-29, 29,-57,-59 dw 32, 18, 96,-74,-35, 78, 24,-45 dw -37, 16,-12,-12,-23,-66, 89,-63 dw 65, 35,-47,-91, 58, 65,-11,-91 Min dw ? Count dw ? Msg1 db 'Matrix:', 0Dh, 0Ah, '$' Msg2 db 'Minimum is:', '$' Msg3 db 0Dh, 0Ah, 'Repeat: ', '$' Msg4 db ' time(s).' CrLf db 0Dh, 0Ah, '$' @data ends @code segment assume cs:@code, ds:@data, ss:@stack main proc ;инициализация сегментного регистра данных mov ax, @data mov ds, ax ;подсчёт количества минимальных элементов lea dx, [Matrix] mov bx, [M] mov cx, [N] call MinMatrix mov [Min], ax mov [Count],cx ;вывод результатов mov ah, 09h lea dx, [Msg1] int 21h lea dx, [Matrix] mov bx, [M] mov cx, [N] call ShowMatrix mov ah, 09h lea dx, [Msg2] int 21h mov ax, [Min] call Show_AX mov ah, 09h lea dx, [Msg3] int 21h mov ax, [Count] call Show_AX mov ah, 09h lea dx, [Msg4] int 21h ;завершение программы mov ax, 4C00h int 21h main endp ;Подсчёт количества минимальных элементов в матрице ;на входе: ; ds:dx - адрес матрицы ; bx - количество столбцов в матрице ; cx - количество строк в матрице ;на выходе: ; ax - значение минимального элемента ; cx - количество минимальных элементов в матрице MinMatrix proc push bx push dx push si push di pushf jcxz @@mmExit or bx, bx jz @@mmExit xchg bx, dx ;bx - адрес матрицы ;dx - количество элементов в строке матрицы mov ax, 7FFFh ;min:=MaxInt - в ax значение минимума mov di, 0 ;Count:=0 - количество минимальных элементов @@mmForI: ;for i:=0 to N-1 do mov si, 0 ; for j:=0 to M-1 do push cx mov cx, dx @@mmForJ: cmp ax, [bx+si] je @@mmIncCount jl @@mmNextJ ; if (min>Matrix[i,j]) ; { mov ax, [bx+si] ; min:=Matrix[i,j] mov di, 0 ; Count:=0 ; } @@mmIncCount: ; if (min==Matrix[i,j]) inc di ; Count++ @@mmNextJ: add si, 2 loop @@mmForJ pop cx add bx, dx add bx, dx loop @@mmForI mov cx, di @@mmExit: popf pop di pop si pop dx pop bx ret MinMatrix endp ;Вывод на экран матрицы слов ;на входе: ; ds:dx - адрес матрицы ; bx - количество столбцов в матрице ; cx - количество строк в матрице ;на входе: ; - ShowMatrix proc push ax push bx push cx push dx push si push di pushf jcxz @@smExit or bx, bx jz @@smExit cld mov cx, cx mov si, dx @@smForI: push cx push bx mov cx, bx @@smForJ: lodsw call Show_AX loop @@smForJ mov ah, 09h lea dx, [CrLf] int 21h pop bx pop cx loop @@smForI @@smExit: popf pop di pop si pop dx pop cx pop bx pop ax ret ShowMatrix endp ; выводит знаковое 16-разрядное число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push si push di mov cx, 10 ;основание системы счисления xor di, di ; di - кол. цифр в числе xor si, si ; si - признак отрицательного числа ; если число в ax отрицательное, то ;1) напечатать (запомнить в стеке) символ '-' ;2) сделать ax положительным or ax, ax jns @@Conv mov si, 1 neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стек or ax, ax jnz @@Conv ;если число отрицательное - помещаем символ "-" в строку or si, si jz @@Positive mov dx, '-' push dx inc di @@Positive: ; выводим из стека на экран ; - сначала пробелы для выравнивания по правому краю mov cx, 8 sub cx, di mov ah, 02h mov dl, ' ' @@LeftPad: int 21h loop @@LeftPad ;сохранённые символы цифр @@Show: pop dx ; dl = очередной выводимый символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop si pop dx pop cx pop bx pop ax ret Show_AX endp @code ends end main