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