Найти наибольший из элементов матрицы, расположенных на главной диагонали - Assembler

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

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

16 24 0 35 s= 28 5 16 34 55 6 28 1 17 3 101 5 Задана матрица. Найти наибольший из элементов матрицы, расположенных на главной диагонали. Результат сообщения вывести на экран

Решение задачи: «Найти наибольший из элементов матрицы, расположенных на главной диагонали»

textual
Листинг программы
  1. .model small
  2. .486
  3. LOCALS  @@
  4. .stack  256
  5. .data
  6.  
  7. Metric  equ     10                      ;система счисления
  8.  
  9. Rows    equ     4               ;максимальное количество строк
  10. Columns equ     4               ;максимальное количество столбцов
  11. arSize  equ     Rows*Columns    ;максимальный размер матрицы
  12. elSize  equ     1               ;размер одного элемента матрицы
  13.  
  14. m       dw      Rows            ;текущее количество строк
  15. n       dw      Columns         ;текущее количество столбцов
  16.  
  17. S       db      16, 24,  0, 35  ;матрица
  18.         db      28,  5, 16, 34
  19.         db      55,  6, 28,  1
  20.         db      17,  3,101,  5
  21.  
  22. asCR_LF db      0Dh, 0Ah, '$'   ;"перевод строки"
  23. asMatrix db     'Matrix S:', '$'
  24. asMax   db      'Max in diagonal S: ',   '$'  ;
  25.  
  26. .code
  27.  
  28. ; выводит число из регистра AX на экран
  29. ; входные данные:
  30. ; ax - число для отображения
  31. Show_AX proc
  32.         push    ax
  33.         push    bx
  34.         push    cx
  35.         push    dx
  36.         push    di
  37.  
  38.         mov     cx, Metric
  39.         xor     di, di          ; di - кол. цифр в числе
  40.  
  41.         ; если число в ax отрицательное, то
  42.         ;1) напечатать '-'
  43.         ;2) сделать ax положительным
  44.         or      ax, ax
  45.         jns     @@Conv
  46.         push    ax
  47.         mov     dx, '-'
  48.         mov     ah, 2           ; ah - функция вывода символа на экран
  49.         int     21h
  50.         pop     ax
  51.  
  52.         neg     ax
  53.  
  54. @@Conv:
  55.         xor     dx, dx
  56.         div     cx              ; dl = num mod 10
  57.         add     dl, '0'         ; перевод в символьный формат
  58.         inc     di
  59.         push    dx              ; складываем в стэк
  60.         or      ax, ax
  61.         jnz     @@Conv
  62.         ; выводим из стэка на экран
  63. @@Show:
  64.         pop     dx              ; dl = очередной символ
  65.         mov     ah, 2           ; ah - функция вывода символа на экран
  66.         int     21h
  67.         dec     di              ; повторяем пока di<>0
  68.         jnz     @@Show
  69.  
  70.         pop     di
  71.         pop     dx
  72.         pop     cx
  73.         pop     bx
  74.         pop     ax
  75.         ret
  76. Show_AX endp
  77.  
  78. ; На входе
  79. ;m     - количество строк
  80. ;n     - количество столбцов
  81. ;ds:dx - адрес матрицы
  82. ShowMatrix proc
  83.         pusha
  84.         mov     si, dx  ; строка  (i) - адрес строки матрицы
  85.  
  86.         mov     ax, Columns
  87.         mov     cx, elSize
  88.         mul     cx
  89.         mov     di, ax  ; di - размер строки матрицы
  90.  
  91.         mov     cx, m   ;cx выполняет роль i (0..m-1)
  92.         @@ForI:
  93.                 mov     dx, cx  ;сохраняем содержимое счётчика cx (i)
  94.                 mov     cx, n   ; теперь cx выполняет роль j (0..n-1)
  95.                 mov     bx, 0   ;смещение элемента относительно начала строки
  96.                 @@ForJ:
  97.                         mov     ax, 0   ;считываем очередной элемент в ax
  98.                         mov     al, [si+bx]
  99.                         call    Show_AX ;вывод числа на экран
  100.  
  101.                         push    dx
  102.                         mov     ah, 02h ;вывод пробела на экран
  103.                         mov     dl, ' '
  104.                         int     21h
  105.                         pop     dx
  106.  
  107.                         add     bx, elSize      ;переход к следующему элементу
  108.                 loop    @@ForJ
  109.                 push    dx
  110.                 mov     ah, 09h ;перевод строки
  111.                 lea     dx, asCR_LF
  112.                 int     21h
  113.                 pop     dx
  114.                 mov     cx, dx
  115.                 add     si, di  ; si - смещение текущей строки матрицы
  116.         loop    @@ForI
  117.         popa
  118.         ret
  119. ShowMatrix endp
  120.  
  121. Main    proc
  122.         mov     dx, @data
  123.         mov     ds, dx
  124.  
  125.         ;вывод матрицы на экран
  126.         mov     ah, 09h
  127.         lea     dx, asMatrix
  128.         int     21h
  129.         mov     ah, 09h
  130.         lea     dx, asCR_LF
  131.         int     21h
  132.         lea     dx, S
  133.         call    ShowMatrix
  134.  
  135.         ;поиск максимального элемента матрицы,
  136.         ;расположенного на главной диагонали
  137.         mov     si, dx  ; строка  (i) - адрес строки матрицы
  138.  
  139.         mov     ax, Columns
  140.         mov     cx, elSize
  141.         mul     cx
  142.         mov     di, ax  ; di - размер строки матрицы
  143.  
  144.         mov     bx, 0   ;смещение элемента относительно начала строки
  145.         mov     al, [si+bx]     ;Max:=S[0, 0]
  146.         mov     ah, 0
  147.         mov     cx, m   ;cx выполняет роль i (0..m-1)
  148.         @@ForI:
  149.                 cmp     al, [si+bx]     ;сравниваем очередной элемент с al
  150.                 jg      @@Next          ;если очередной элемент меньше или равен максимальному
  151.                                         ;то переходим к следующему
  152.                 mov     al, [si+bx]     ;иначе - обновляем значение максимального элемента
  153.                 @@Next:
  154.                 add     si, di          ;переход к следующей строке
  155.                 add     bx, elSize      ;переход к следующему элементу в строке
  156.         loop    @@ForI
  157.  
  158.         ;вывод максимального элемента
  159.         push    ax
  160.         mov     ah, 09h
  161.         lea     dx, asMax
  162.         int     21h
  163.         pop     ax
  164.         call    Show_AX
  165.  
  166.         ;завершение программы
  167.         mov     ax, 4c00h
  168.         int     21h
  169. Main    endp
  170.  
  171. end     Main

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


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

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

13   голосов , оценка 4.154 из 5

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

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

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