Найти максимальный элемент матрицы - Assembler

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

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

Дан массив v(4х4). Найти максимальный элемент этого массива. В тексте написать название (полностью) “БГПУ”. В режиме редактирования изменить коды на свои инициалы. (Я.Д.Р.)

Решение задачи: «Найти максимальный элемент матрицы»

textual
Листинг программы
  1. .model small
  2. .486
  3. LOCALS  @@
  4. .stack  100h
  5. .data
  6.  
  7. Metric  equ     10                      ;система счисления
  8.  
  9. Rows    equ     4               ;максимальное количество строк
  10. Columns equ     4               ;максимальное количество столбцов
  11. elSize  equ     2               ;размер одного элемента матрицы
  12. arSize  equ     Rows*Columns*elSize;максимальный размер матрицы
  13.  
  14. m       dw      Rows            ;текущее количество строк
  15. n       dw      Columns         ;текущее количество столбцов
  16.  
  17. S       dw      16, 24,  0, 35  ;матрица
  18.         dw      28,  5, 16, 34
  19.         dw      55,  6, 28,  1
  20.         dw      17,  3,101,  5
  21.  
  22. asCR_LF db      0Dh, 0Ah, '$'   ;"перевод строки"
  23. asMatrix db     'Matrix M:', '$'
  24. asMax   db      'Max: ',   '$'  ;
  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, [si+bx]     ;считываем очередной элемент в ax
  98.                         call    Show_AX ;вывод числа на экран
  99.  
  100.                         push    dx
  101.                         mov     ah, 02h ;вывод пробела на экран
  102.                         mov     dl, ' '
  103.                         int     21h
  104.                         pop     dx
  105.  
  106.                         add     bx, elSize      ;переход к следующему элементу
  107.                 loop    @@ForJ
  108.                 push    dx
  109.                 mov     ah, 09h ;перевод строки
  110.                 lea     dx, asCR_LF
  111.                 int     21h
  112.                 pop     dx
  113.                 mov     cx, dx
  114.                 add     si, di  ; si - смещение текущей строки матрицы
  115.         loop    @@ForI
  116.         popa
  117.         ret
  118. ShowMatrix endp
  119.  
  120. Main    proc
  121.         mov     dx, @data
  122.         mov     ds, dx
  123.  
  124.         ;вывод матрицы на экран
  125.         mov     ah, 09h
  126.         lea     dx, asMatrix
  127.         int     21h
  128.         mov     ah, 09h
  129.         lea     dx, asCR_LF
  130.         int     21h
  131.         lea     dx, S
  132.         call    ShowMatrix
  133.  
  134.         ;поиск максимального элемента матрицы,
  135.         ;расположенного на главной диагонали
  136.         lea     si, S  ; строка  (i) - адрес строки матрицы
  137.  
  138.         mov     ax, Columns
  139.         mov     cx, elSize
  140.         mul     cx
  141.         mov     di, ax  ; di - размер строки матрицы
  142.  
  143.         mov     ax, [si]    ;Max:=S[0, 0]
  144.         mov     cx,     m   ;cx выполняет роль i (0..m-1)
  145. @@ForI:
  146.         mov     bx, 0   ;смещение элемента относительно начала строки
  147.         push    cx
  148.         mov     cx,     n
  149.         @@ForJ:
  150.                 cmp     ax, [si+bx]     ;сравниваем очередной элемент с al
  151.                 jge     @@Next          ;если очередной элемент меньше или равен максимальному
  152.                                         ;то переходим к следующему
  153.                 mov     ax, [si+bx]     ;иначе - обновляем значение максимального элемента
  154.         @@Next:
  155.                 add     bx, elSize      ;переход к следующему элементу в строке
  156.                 loop    @@ForJ
  157.         pop     cx
  158.         add     si, di          ;переход к следующей строке
  159.         loop    @@ForI
  160.  
  161.         ;вывод максимального элемента
  162.         push    ax
  163.         mov     ah, 09h
  164.         lea     dx, asMax
  165.         int     21h
  166.         pop     ax
  167.         call    Show_AX
  168.  
  169.         ;завершение программы
  170.         mov     ax, 4c00h
  171.         int     21h
  172. Main    endp
  173.  
  174. end     Main

Объяснение кода листинга программы

  1. В начале кода объявляется модель программы - small и используемая версия языка - 486.
  2. Объявляются переменные и инициализируются:
    • Metric: система счисления, равная 10;
    • Rows: максимальное количество строк, равное 4;
    • Columns: максимальное количество столбцов, равное 4;
    • elSize: размер одного элемента матрицы, равный 2;
    • arSize: максимальный размер матрицы, вычисляемый как Rows Columns elSize;
    • m: текущее количество строк матрицы, равное Rows;
    • n: текущее количество столбцов матрицы, равное Columns;
    • S: матрица размером 4x4, заданная значением каждого элемента;
    • asCR_LF: перевод строки;
    • asMatrix: строка Matrix M:;
    • asMax: строка Max:.
  3. Далее идет процедура Show_AX, которая выводит число из регистра AX на экран.
  4. Затем следует процедура ShowMatrix, которая выводит переданную матрицу на экран.
  5. Процедура Main - главная процедура программы, где осуществляется вызов всех остальных процедур.
    • Вначале инициализируются регистры dx и ds для работы с данными программы.
    • Затем вызывается процедура ShowMatrix для вывода матрицы на экран.
    • Далее идет поиск максимального элемента матрицы, расположенного на главной диагонали.
    • После этого максимальный элемент выводится на экран с помощью процедуры Show_AX.
    • В конце программы происходит завершение программы с помощью системного вызова int 21h с параметром 4c00h.

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


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

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

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

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

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

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