В матрице вычислить сумму столбцов - 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