Найти сумму элементов третьего треугольника матрицы (tasm) - Assembler
Формулировка задачи:
Задана квадратная матрица А(N,N). N – нечетное число. Двумя диагоналями матрица делится на четыре треугольника. Нумерация треугольников сверху по часовой стрелке. Найти сумму чисел в третьем треугольнике. Элементы, входящие в диагонали, считать принадлежащими соответствующим треугольникам.
Прошу помощи в изменении кода под задание. Спасибо
DSEG SEGMENT
; индивидуальные данные - начало
N=4
M dw 3
A dw 20,3,-5
dw 3,-5,0
dw 4,23,-7
dw -3,-7,-5
B dw N dup(?)
TextA db 'Матрица : ',13,10,'$'
TextB db 'Массив В: ',13,10,'$'
; индивидуальные данные - конец
Prob db ' $'
NL db 13,10,'$' ;перевод строки
Buffer db 6 dup (?),'$'
MST dw ?
MSTR dw ?
DSEG ENDS
Stacks segment
dw 140 dup (?)
Stacks ends
CODES SEGMENT
MAIN PROC FAR
Assume CS:codes, DS:dseg, SS:stacks
Mov AX,Dseg
Mov DS,AX
;**********************************************************************
; индивидуальная часть программы - начало
LEA DX,TextA
call PRT ;печать 'Матрица А : '
LEA BP,A ;в ВР адрес начала матрицы А
Mov AX,M
Mov MST,AX ; MST - количество столбцов матрицы
Mov AX,N
Mov MSTR,AX ; MSTR - количество строк матрицы
CALL PRINTMATR
Lea DX,TextB ; печать "Массив В"
Call PRT
;Пусть i - BX, j - CX
Xor BX,BX ;блок 4
BL5:
Xor CX,CX ;блок 5
Mov SI,BX
Sal SI,1
Mov B[SI],0
BL6:
Mov AX,BX
Imul M
Add AX,CX
Sal AX,1
Mov BP,AX
Mov AX,A[DS:BP]
CMP AX,0
JG BL7
JMP BL8
BL7:
Add B[SI],AX
BL8:
Inc CX ; блок 8
Cmp CX,M ; блок 9
Jl BL6
Mov AX,B[SI] ;блок 10
Call PRN
Lea DX,NL
Call PRT
Inc BX ; блок 11
Cmp BX,N ; блок 12
Jl BL5
; индивидуальная программа - конец
;**********************************************************************
Mov AH,4CH
Int 21h
MAIN ENDP
;*********************************************************
PRINTMATR PROC ; процедура печати матрицы построчно
; в регистре ВР адрес начала матрицы, MST – количество столбцов
; матрицы, MSTR- количество строк.
рush AX
push BX
push CX
push DX
push SI
;Пусть i - DX, j - CX
Xor DX,DX
Prmatr1:
хor CX,CX
Prmatr2:
Mov AX,DX
push DX
MUL MST
Add AX,CX
SAL AX,1
Mov SI,AX
Mov AX,DS:[BP][SI]
LEA BX,Buffer
CALL CONVBA
LEA DX,Buffer
Mov AH,09h
Int 21h
LEA DX,Prob
Int 21h
POP DX
Inc CX
CMP CX,MST
JL Prmatr2
push DX
LEA DX,NL
Mov Ah,09h
Int 21h
POP DX
Inc DX
CMP DX,MSTR
JL Prmatr1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
PRINTMATR ENDP
;*********************************************************
CONVBA PROC
…
CONVBA endp
;*********************************************************
PRT PROC ; процедура печати текста
…
PRT ENDP
;*********************************************************
PRN PROC ; процедура печати числа
PRN ENDP
;*****************************************************
CODES ENDS
END MAINРешение задачи: «Найти сумму элементов третьего треугольника матрицы (tasm)»
textual
Листинг программы
; fasm code............... ; Вычисляет сумму элементов нижнего треугольника ; Разрядность матрицы в пределах 3..9 (нечётные) ; Пример 9-ти разрядной матрицы: ;----------------------------------------------- ; 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 x 0 0 0 0 ; 0 0 0 x x x 0 0 0 ; 0 0 x x x x x 0 0 ; 0 x x x x x x x 0 ; x x x x x x x x x ;------------------------------------------------ ;.model small ;.386 ;.stack 256 org 100h jmp start ;.data ------------ mes0 db 13,10,' Введите разрядность матрицы: $' mes1 db 13,10,' Исходный массив (без знака)...' db 13,10,' ------------------------------',13,10,'$' mes2 db 13,10,' ------------------------------' db 13,10,' Сумма треугольника(3): $' align 16 ; выравнивание памяти по-параграфу array db 128 dup(0) ; массив, забитый нулями len dw 0 ; число N (разрядность матрицы) crlf db 13,10,'$' ; перевод строки для вывода на экран ;.code ------------ start: mov dx,mes0 ; call message ; @@1: xor ax,ax ; int 16h ; запрашиваем разрядность cmp al,'3' ; 3..9 jb @@1 ; cmp al,'9' ; ja @@1 ; test al,1 ; нечётное jz @@1 ; int 29h ; and ax,0Fh ; mov [len],ax ;<----; запоминаем N ! ;------------------------------------------------------------------------ mov dx,mes1 ; создаём случайный массив (Random) call message ; mov cx,[len] ; imul cx,cx ; длина массива push cx ; запомним для сл.операции.. mov di,array ; приёмник call createPrintArray ; зовём процедуру! ;------------------------------------------------------------------------ pop cx ; вычисляем указатеь, shr cx,1 ; ..на макушку нижнего треугольника mov si,array ; add si,cx ;<----; SI - макушка! ;------------------------------------------------------------------------ xor ax,ax ; сюда будем читать элементы xor dx,dx ; DX - будет сумма mov bx,[len] ; sub bx,2 ; BX - смещение сл.элемента в строке mov cx,1 ; СХ - кол-во элементов для чтения cycle: push cx ; @@2: lodsb ; читаем байт из SI add dx,ax ; прибавляем к DX loop @@2 ; мотаем СХ-раз.. add si,bx ; смещаемся на строку вниз sub bx,2 ; вычитаем смещение для сл.строки pop cx ; add cx,2 ;<----; увеличиваем счётчик чтения cmp cx,[len] ; счётчик меньше/равно разрядности? jbe cycle ; да - мотаем внешний цикл.. push dx ;<----; сумма элементов треугольника! ;------------------------------------------------------------------------ mov dx,mes2 ; call message ; pop ax ; call hex2asc ; выводим её на экран! exit: xor ax,ax ; int 16h ; mov ax,4c00h ; на выход! int 21h ; ;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн message: mov ah,9 ; int 21h ; ret ; ;--------------------------------------------------------------------------- hex2asc: ; Функция переводит числа в символы pusha ; Вход: АХ = число, BX = система счисления xor cx,cx ; Выход: на экране mov bx,10 ; isDiv: xor dx,dx ; div bx ; push dx ; inc cx ; or ax,ax ; jnz isDiv ; isOut: pop ax ; cmp al,9 ; jle noHex ; add al,7 ; noHex: add al,30h ; int 29h ; loop isOut ; popa ; ret ; ;---------------------------------------------------------------- createPrintArray: ; Создаём массив рандомом, mov bx,[len] ; ..сохраняем по адресу DI, @@3: push cx ; .. и сразу выводим его на экран xor cx,cx ; loop $ ; задержка! (на месте шагом/марш) pop cx ; in al,40h ; читаем системныые тики mov byte[di],al ; сохраняем этот байт в DI inc di ; сл.позиция в массиве xor ah,ah ; call hex2asc ; выводим его на экран mov al,',' ; вставляем разделитель int 29h ; dec bx ; уменьшаем счётчик столбцов jnz @@4 ; прыг, если не конец строки mov bx,[len] ; иначе: дефолт кол-ва стольцов mov dx,crlf ; ..и перевод строки call message ; @@4: loop @@3 ; в СХ была длина массива ret ; ..мотаем цикл до нуля ;.end start