На главной диагонали матрицы найти сумму всех ее элементов - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д