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