На главной диагонали матрицы найти сумму всех ее элементов - Assembler

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

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

Здравствуйте! Помогите написать программу.

Задание:

Даны 3 квадратных матрицы различных размерностей. Для каждой из них в строках с нулевым элементом на главной диагонали найти сумму всех элементов. Проверить, если сумма может храниться в байте, то выдать ответ «Да», иначе «Нет». Вот программа, в которую вводятся 3 различных квадратных матрицы и считается сумма элементов главных диагоналей. Нужна проверка на 0 на главной диагонали и вывод "да" или "нет".

Решение задачи: «На главной диагонали матрицы найти сумму всех ее элементов»

textual
Листинг программы
prg segment para public 'code'          ;заголовок сегмента
assume cs:prg, ds:prg, es:prg, ss:prg   ;сообщим транслятору о намерении установить сегментные  
                                        ;регистры  cs, ds, es на наш сегмент
org 100h                                ;устанавливает относительный адрес для начала выполнения программы. Ее использование необходимо, если создается COM-файл.
beg: jmp start                          ;переход на start
mess1 db 0ah, 0dh, 'Vvedite razmernost: $'
mess2 db 0ah, 0dh, 'Vvedite elementi A: $'
mess3 db 0ah, 0dh, 'Vvedite elementi B: $'
mess4 db 0ah, 0dh, 'Vvedite elementi C: $'
mess5 db 0ah, 0dh, 'Summa elementov ravna: $'
mess6 db 0ah, 0dh, 'Na glavnoy diagonali net 0...'
mess7 db 0ah, 0dh, 'Da'
mess8 db 0ah, 0dh, 'Net'
answer db 7 dup(?),'$'      ;буфер под ответ
bufer db 0ah,0,11 dup(?)    ;буфер для ввода
na dw ?                     ;размерность матрицы A
nb dw ?                     ;размерность матрицы B
nc dw ?                     ;размерность матрицы C
a dw 25 dup(?)              ;память под матрицу A
b dw 25 dup(?)              ;память под матрицу B
cc dw 25 dup(?)             ;память под матрицу C
d dw 5 dup(?)               ;память под вспомогательный массив D
n1 dw ?                     ;сумма элементов матрицы A
n2 dw ?                     ;сумма элементов матрицы B
n3 dw ?                     ;сумма элементов матрицы C
newline db 0ah,0dh,'$'      ;для перевода строки
include bin2str.asm         ;преобразует число в строку
include str2bin.asm         ;преобразует строку в число
; input – подпрограмма для ввода одного числа 
; Вход: в dx - адрес буфера,  
; Выход: в ax возвращается введенное число
input proc
    push bx         ;сохраним используемые регистры 
    push dx
    push dx         ;сохраним адрес буфера, т.к. он будет запорчен при организации вывода строки newline 
    lea dx,newline
    mov ah,09h
    int 21h         ;вывод строки
    pop dx          ;восстановим адрес буфера ввода
    mov ah,0ah      ;помещаем в ah номер прерывания
    int 21h         ;для ввода строки
    mov bx,dx       ;строка по адресу ds:dx
    inc bx          ;увеличиваем на 1 ee адрес и передаем его в процедуру str2bin 
    call str2bin    ;преобразуем строку в число 
    pop dx          ;число будет в ax
    pop bx
    ret
input endp
; Процедура вывода числа, находящегося в ax 
output proc
    push bx         ;сохраним используемый регистр
    lea bx,answer   ;адрес буфера для преобразования
    call bin2str    ;преобразуем число в строку
    lea dx,answer+1 ;помещаем в dx адрес начала строки 
    mov ah,09h      ;помещаем в ah номер прерывания
    int 21h         ;вывода строки
    lea dx,newline  ;переход на новую строку
    mov ah,09h
    int 21h
    pop bx          ;восстановление bx
    ret
output endp
; Функция ввода матрицы
ENTER_MATRIX MACRO N, X
LOCAL v1, v2
    mov cx,N        ;в cx запишем счетчик цикла по строкам
    lea bx,X        ;в bx запишем адрес начала матрицы X
    mov si,0        ;смещение от начала матрицы равно нулю
v1: push cx         ;перед организацией цикла сохраним счетчик по строкам
    mov cx,N        ;в cx запишем счетчик цикла по столбцам
v2: push cx         ;сохраним счетчик внутреннего цикла
    lea dx,bufer    ;в dx адрес буфера для ввода
    call input      ;введем одно число (вернется в ax)
    mov [bx][si],ax ;и запишем его в матрицу X по адресу (bx)+(si) с помощью базово-индексной адресации
    add si,2        ;переход к следующему элементу
    pop cx          ;восстановим счетчик цикла
    loop v2         ;продолжим цикл ввода элементов одной строки
    pop cx          ;восстановим счетчик внешнего цикла
    loop v1         ;перейдем к следующей строке
ENDM
 
; Функция проверки на 0 на главной диагонали
; И подсчёта суммы элементов на гл. диагонали
EDIT MACRO N, X
LOCAL c1, v1, v2, v3, v4, da
    lea bx,X        ;в bx адрес начала матрицы X
    lea bp,d        ;в bp адрес начала массива D
    mov di,0        ;смещение от начала массива 0
    mov si,0        ;смещение от начала матрицы 0
    mov cx,N        ;организуем цикл по строкам матрицы X 
c1: mov ax,[bx][si] ;в ax запишем элемент из матрицы по адресу (bx)+(si)
    mov [bp][di],ax ;и переместим его в массив D
    add di,2        ;переход к следующему элементу массива D
    add si,2        ;переход к следующему элементу 
    add si,N        ;главной диагонали
    add si,N        ;матрицы X
    loop c1
    ;Проверка на 0
    mov cx,N
    lea bx,d
    mov si,0
    mov dx,0
v1: push cx
    mov ax,[bx][si]
    cmp ax, 0
    jz v2
    add si,2
    pop cx
    loop v1
    lea dx,mess6
    mov ah,09h
    int 21h
    jmp v4
    ;Если нашли 0, то выводим сумму
v2: lea dx,mess5
    mov ah,09h
    int 21h
    mov cx,N
    lea bx,d
    mov si,0
    mov dx,0
v3: push cx
    mov ax,[bx][si]
    add dx, ax
    add si,2
    pop cx
    loop v3
    mov ax, dx
    call output
    cmp ax,127
    jb da
    lea dx,mess8
    mov ah,09h
    int 21h
da: lea dx,mess7
    mov ah,09h
    int 21h
v4: 
ENDM
 
 
; Сама программа
start:
;Ввод матриц
    lea dx,mess1    ;Загружаем в dx адрес строки для ввода Na 
    mov ah,09h      ;функция 09h – реализует вывод строки
    int 21h         ;вызываем прерывание int 21h 
    lea dx,bufer    ;загружаем в dx адрес буфера для ввода
    call input      ;вызываем input 
    mov na,ax       ;сохраним введенное число в Na
    lea dx,mess2    ;Загружаем в dx адрес строки для ввода A 
    mov ah,09h      
    int 21h         ;и выводим сообщение
    ENTER_MATRIX na, a
    
    lea dx,mess1    ;Загружаем в dx адрес строки для ввода Nb
    mov ah,09h      ;функция 09h – реализует вывод строки
    int 21h         ;вызываем прерывание int 21h
    lea dx,bufer    ;загружаем в dx адрес буфера для ввода
    call input      ;вызываем input
    mov nb,ax       ;сохраним введенное число в Nb
    lea dx,mess3    ;Загружаем в dx адрес строки для ввода B
    mov ah,09h      
    int 21h         ;и выводим сообщение
    ENTER_MATRIX nb, b
    
    lea dx,mess1    ;Загружаем в dx адрес строки для ввода Na 
    mov ah,09h      ;функция 09h – реализует вывод строки
    int 21h         ;вызываем прерывание int 21h 
    lea dx,bufer    ;загружаем в dx адрес буфера для ввода
    call input      ;вызываем input 
    mov nc,ax       ;сохраним введенное число в Na
    lea dx,mess4    ;Загружаем в dx адрес строки для ввода A 
    mov ah,09h      
    int 21h         ;и выводим сообщение
    ENTER_MATRIX nc, cc
    
; Вывод суммы элементов главной диагонали
    EDIT na, a
    EDIT nb, b
    EDIT nc, cc
    
    int 20h
prg ends
end beg

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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