Найти сумму элементов третьего треугольника матрицы (tasm) - Assembler

Узнай цену своей работы

Формулировка задачи:

Задана квадратная матрица А(N,N). N – нечетное число. Двумя диагоналями матрица делится на четыре треугольника. Нумерация треугольников сверху по часовой стрелке. Найти сумму чисел в третьем треугольнике. Элементы, входящие в диагонали, считать принадлежащими соответствующим треугольникам. Прошу помощи в изменении кода под задание. Спасибо
Листинг программы
  1. DSEG SEGMENT
  2. ; индивидуальные данные - начало
  3. N=4
  4. M dw 3
  5. A dw 20,3,-5
  6. dw 3,-5,0
  7. dw 4,23,-7
  8. dw -3,-7,-5
  9. B dw N dup(?)
  10.  
  11. TextA db 'Матрица : ',13,10,'$'
  12. TextB db 'Массив В: ',13,10,'$'
  13. ; индивидуальные данные - конец
  14. Prob db ' $'
  15. NL db 13,10,'$' ;перевод строки
  16. Buffer db 6 dup (?),'$'
  17. MST dw ?
  18. MSTR dw ?
  19. DSEG ENDS
  20. Stacks segment
  21. dw 140 dup (?)
  22. Stacks ends
  23. CODES SEGMENT
  24. MAIN PROC FAR
  25. Assume CS:codes, DS:dseg, SS:stacks
  26. Mov AX,Dseg
  27. Mov DS,AX
  28. ;**********************************************************************
  29. ; индивидуальная часть программы - начало
  30. LEA DX,TextA
  31. call PRT ;печать 'Матрица А : '
  32. LEA BP,A ВР адрес начала матрицы А
  33. Mov AX,M
  34. Mov MST,AX ; MST - количество столбцов матрицы
  35. Mov AX,N
  36. Mov MSTR,AX ; MSTR - количество строк матрицы
  37. CALL PRINTMATR
  38. Lea DX,TextB ; печать "Массив В"
  39. Call PRT
  40. ;Пусть i - BX, j - CX
  41. Xor BX,BX ;блок 4
  42. BL5:
  43. Xor CX,CX ;блок 5
  44. Mov SI,BX
  45. Sal SI,1
  46. Mov B[SI],0
  47. BL6:
  48. Mov AX,BX
  49. Imul M
  50. Add AX,CX
  51. Sal AX,1
  52. Mov BP,AX
  53. Mov AX,A[DS:BP]
  54. CMP AX,0
  55. JG BL7
  56. JMP BL8
  57. BL7:
  58. Add B[SI],AX
  59. BL8:
  60. Inc CX ; блок 8
  61. Cmp CX,M ; блок 9
  62. Jl BL6
  63. Mov AX,B[SI] ;блок 10
  64. Call PRN
  65. Lea DX,NL
  66. Call PRT
  67. Inc BX ; блок 11
  68. Cmp BX,N ; блок 12
  69. Jl BL5
  70. ; индивидуальная программа - конец
  71. ;**********************************************************************
  72.  
  73. Mov AH,4CH
  74. Int 21h
  75. MAIN ENDP
  76. ;*********************************************************
  77. PRINTMATR PROC ; процедура печати матрицы построчно
  78. ; в регистре ВР адрес начала матрицы, MST количество столбцов
  79. ; матрицы, MSTR- количество строк.
  80. рush AX
  81. push BX
  82. push CX
  83. push DX
  84. push SI
  85. ;Пусть i - DX, j - CX
  86. Xor DX,DX
  87. Prmatr1:
  88. хor CX,CX
  89. Prmatr2:
  90. Mov AX,DX
  91. push DX
  92. MUL MST
  93. Add AX,CX
  94. SAL AX,1
  95. Mov SI,AX
  96. Mov AX,DS:[BP][SI]
  97. LEA BX,Buffer
  98. CALL CONVBA
  99. LEA DX,Buffer
  100. Mov AH,09h
  101. Int 21h
  102. LEA DX,Prob
  103. Int 21h
  104. POP DX
  105. Inc CX
  106. CMP CX,MST
  107. JL Prmatr2
  108. push DX
  109. LEA DX,NL
  110. Mov Ah,09h
  111. Int 21h
  112. POP DX
  113. Inc DX
  114. CMP DX,MSTR
  115. JL Prmatr1
  116. POP SI
  117. POP DX
  118. POP CX
  119. POP BX
  120. POP AX
  121. RET
  122. PRINTMATR ENDP
  123. ;*********************************************************
  124. CONVBA PROC
  125. CONVBA endp
  126. ;*********************************************************
  127. PRT PROC ; процедура печати текста
  128. PRT ENDP
  129. ;*********************************************************
  130. PRN PROC ; процедура печати числа
  131. PRN ENDP
  132. ;*****************************************************
  133. CODES ENDS
  134. END MAIN

Решение задачи: «Найти сумму элементов третьего треугольника матрицы (tasm)»

textual
Листинг программы
  1. ; fasm code...............
  2. ; Вычисляет сумму элементов нижнего треугольника
  3. ; Разрядность матрицы в пределах 3..9 (нечётные)
  4. ; Пример 9-ти разрядной матрицы:
  5. ;-----------------------------------------------
  6. ;              0 0 0 0 0 0 0 0 0
  7. ;              0 0 0 0 0 0 0 0 0
  8. ;              0 0 0 0 0 0 0 0 0
  9. ;              0 0 0 0 x 0 0 0 0
  10. ;              0 0 0 x x x 0 0 0
  11. ;              0 0 x x x x x 0 0
  12. ;              0 x x x x x x x 0
  13. ;              x x x x x x x x x
  14. ;------------------------------------------------
  15. ;.model small
  16. ;.386
  17. ;.stack 256
  18.  
  19. org 100h
  20. jmp start
  21.  
  22. ;.data ------------
  23. mes0    db    13,10,' Введите разрядность матрицы: $'
  24. mes1    db    13,10,' Исходный массив (без знака)...'
  25.         db    13,10,' ------------------------------',13,10,'$'
  26. mes2    db    13,10,' ------------------------------'
  27.         db    13,10,' Сумма треугольника(3): $'
  28.  
  29. align   16                       ; выравнивание памяти по-параграфу
  30. array   db    128 dup(0)         ; массив, забитый нулями
  31. len     dw    0                  ; число N (разрядность матрицы)
  32. crlf    db    13,10,'$'          ; перевод строки для вывода на экран
  33.  
  34. ;.code ------------
  35. start:  mov   dx,mes0            ;
  36.         call  message            ;
  37. @@1:    xor   ax,ax              ;
  38.         int   16h                ; запрашиваем разрядность
  39.         cmp   al,'3'             ; 3..9
  40.         jb    @@1                ;
  41.         cmp   al,'9'             ;
  42.         ja    @@1                ;
  43.         test  al,1               ; нечётное
  44.         jz    @@1                ;
  45.         int   29h                ;
  46.         and   ax,0Fh             ;
  47.         mov   [len],ax     ;<----; запоминаем N !
  48. ;------------------------------------------------------------------------
  49.         mov   dx,mes1            ; создаём случайный массив (Random)
  50.         call  message            ;
  51.         mov   cx,[len]           ;
  52.         imul  cx,cx              ; длина массива
  53.         push  cx                 ; запомним для сл.операции..
  54.         mov   di,array           ; приёмник
  55.         call  createPrintArray   ; зовём процедуру!
  56. ;------------------------------------------------------------------------
  57.         pop   cx                 ; вычисляем указатеь,
  58.         shr   cx,1               ;      ..на макушку нижнего треугольника
  59.         mov   si,array           ;
  60.         add   si,cx        ;<----; SI - макушка!
  61. ;------------------------------------------------------------------------
  62.         xor   ax,ax              ; сюда будем читать элементы
  63.         xor   dx,dx              ; DX - будет сумма
  64.         mov   bx,[len]           ;
  65.         sub   bx,2               ; BX - смещение сл.элемента в строке
  66.         mov   cx,1               ; СХ - кол-во элементов для чтения
  67. cycle:  push  cx                 ;
  68.  
  69. @@2:    lodsb                    ; читаем байт из SI
  70.         add   dx,ax              ; прибавляем к DX
  71.         loop  @@2                ; мотаем СХ-раз..
  72.  
  73.         add   si,bx              ; смещаемся на строку вниз
  74.         sub   bx,2               ; вычитаем смещение для сл.строки
  75.         pop   cx                 ;
  76.         add   cx,2         ;<----; увеличиваем счётчик чтения
  77.         cmp   cx,[len]           ; счётчик меньше/равно разрядности?
  78.         jbe   cycle              ; да - мотаем внешний цикл..
  79.  
  80.         push  dx           ;<----; сумма элементов треугольника!
  81. ;------------------------------------------------------------------------
  82.         mov   dx,mes2            ;
  83.         call  message            ;
  84.         pop   ax                 ;
  85.         call  hex2asc            ; выводим её на экран!
  86.  
  87. exit:   xor   ax,ax              ;
  88.         int   16h                ;
  89.         mov   ax,4c00h           ; на выход!
  90.         int   21h                ;
  91.  
  92. ;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  93. message:
  94.         mov   ah,9               ;
  95.         int   21h                ;
  96.         ret                      ;
  97. ;---------------------------------------------------------------------------
  98. hex2asc:                         ; Функция переводит числа в символы
  99.         pusha                    ; Вход:  АХ = число, BX = система счисления
  100.         xor   cx,cx              ; Выход: на экране
  101.         mov   bx,10              ;
  102. isDiv:  xor   dx,dx              ;
  103.         div   bx                 ;
  104.         push  dx                 ;
  105.         inc   cx                 ;
  106.         or    ax,ax              ;
  107.         jnz   isDiv              ;
  108. isOut:  pop   ax                 ;
  109.         cmp   al,9               ;
  110.         jle   noHex              ;
  111.         add   al,7               ;
  112. noHex:  add   al,30h             ;
  113.         int   29h                ;
  114.         loop  isOut              ;
  115.         popa                     ;
  116.         ret                      ;
  117. ;----------------------------------------------------------------
  118. createPrintArray:                ; Создаём массив рандомом,
  119.         mov   bx,[len]           ;   ..сохраняем по адресу DI,
  120. @@3:    push  cx                 ;      .. и сразу выводим его на экран
  121.         xor   cx,cx              ;
  122.         loop  $                  ; задержка! (на месте шагом/марш)
  123.         pop   cx                 ;
  124.         in    al,40h             ; читаем системныые тики
  125.         mov   byte[di],al        ; сохраняем этот байт в DI
  126.         inc   di                 ; сл.позиция в массиве
  127.         xor   ah,ah              ;
  128.         call  hex2asc            ; выводим его на экран
  129.         mov   al,','             ; вставляем разделитель
  130.         int   29h                ;
  131.         dec   bx                 ; уменьшаем счётчик столбцов
  132.         jnz   @@4                ; прыг, если не конец строки
  133.         mov   bx,[len]           ; иначе: дефолт кол-ва стольцов
  134.         mov   dx,crlf            ;    ..и перевод строки
  135.         call  message            ;
  136. @@4:    loop  @@3                ; в СХ была длина массива
  137.         ret                      ;    ..мотаем цикл до нуля
  138. ;.end start

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


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

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

11   голосов , оценка 3.909 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы