В матрице вычислить сумму столбцов - Assembler

Узнай цену своей работы

Формулировка задачи:

Матрица A[N, M] (М кратно 4) разделена по вертикали на две половины. Определить сумму элементов каждого столбца левой половины и сумму элементов каждого четного столбца правой половины матрицы А. На языке Ассемблера помогите пожалуйста срочно нужно.

Решение задачи: «В матрице вычислить сумму столбцов»

textual
Листинг программы
@stack  segment para stack
        db      1024 dup(?)
@stack  ends
 
@data   segment
        N       dw      5
        M       dw      8
        Matrix  dw      -76,-52, -8,-37, 79,-11, 55,-28
                dw      -44,-88,-55, 42, -4, 96,-88, 20
                dw      -23,-12, 26,-23, 11,-93, -4,-37
                dw       95,-53, 14,-23, 77, 56, 72,-53
                dw       83,-60, 82, 69, 40,-20,-83,-94
        Msg1    db      'The sum of the elements of the', '$'
        Msg2    db      ' column of the matrix is equal', '$'
        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    ShowMatrix
        ;подсчёт суммы столбцов левой половины матрицы
        mov     cx,     [M]
        mov     si,     1
        @@For1:
                ;если это левая половина - считать сумму столбцов
                mov     ax,     [M]
                shr     ax,     1
                cmp     si,     ax
                jbe     @@Calc
                ;если это правая половина - считать сумму чётных
                ;столбцов
                test    si,     1
                jnz     @@Next1
                ;вычисления и вывод
        @@Calc:
                push    cx
                lea     dx,     [Matrix]
                mov     bx,     [M]
                mov     cx,     [N]
                mov     ax,     si
                dec     ax
                call    SumColumn
                mov     bx,     ax
                mov     ah,     09h
                lea     dx,     [Msg1]
                int     21h
                mov     ax,     si
                call    Show_AX
                mov     ah,     09h
                lea     dx,     [Msg2]
                int     21h
                mov     ax,     bx
                call    Show_AX
                mov     ah,     09h
                lea     dx,     [CrLf]
                int     21h
                pop     cx
        @@Next1:
                inc     si
        loop    @@For1
        ;завершение программы
        mov     ax,     4C00h
        int 21h
main    endp
 
;Вычисление суммы столбца матрицы
;на входе:
;  ds:dx - адрес матрицы
;  bx    - количество столбцов в матрице
;  cx    - количество строк в матрице
;  ax    - номер столбца матрицы, в котором необходимо
;          подсчитать сумму (от 0)
;на входе:
;  ax    - сумма элементов столбца матрицы
SumColumn       proc
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        pushf
 
        mov     si,     ax
        shl     si,     1
        add     si,     dx
 
        cmp     ax,     bx
        mov     ax,     0
        jae     @@sumExit
        or      bx,     bx
        jz      @@sumExit
 
        shl     bx,     1
 
        @@sumFor:
                add     ax,     [si]
                add     si,     bx
        loop    @@sumFor
@@sumExit:
        popf
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        ret
SumColumn       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.167 из 5
Похожие ответы