Написать и протестировать функцию, подсчитывающую количество минимальных элементов в целочисленной матрице - 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

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

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