Найти сумму элементов третьего треугольника матрицы (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

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


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

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

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