Найти максимальный элемент матрицы - Assembler
Формулировка задачи:
Дан массив v(4х4). Найти максимальный элемент этого массива. В тексте написать название (полностью) “БГПУ”. В режиме редактирования изменить коды на свои инициалы. (Я.Д.Р.)
Решение задачи: «Найти максимальный элемент матрицы»
textual
Листинг программы
.model small .486 LOCALS @@ .stack 100h .data Metric equ 10 ;система счисления Rows equ 4 ;максимальное количество строк Columns equ 4 ;максимальное количество столбцов elSize equ 2 ;размер одного элемента матрицы arSize equ Rows*Columns*elSize;максимальный размер матрицы m dw Rows ;текущее количество строк n dw Columns ;текущее количество столбцов S dw 16, 24, 0, 35 ;матрица dw 28, 5, 16, 34 dw 55, 6, 28, 1 dw 17, 3,101, 5 asCR_LF db 0Dh, 0Ah, '$' ;"перевод строки" asMatrix db 'Matrix M:', '$' asMax db 'Max: ', '$' ; .code ; выводит число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, Metric xor di, di ; di - кол. цифр в числе ; если число в ax отрицательное, то ;1) напечатать '-' ;2) сделать ax положительным or ax, ax jns @@Conv push ax mov dx, '-' mov ah, 2 ; ah - функция вывода символа на экран int 21h pop ax neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@Conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp ; На входе ;m - количество строк ;n - количество столбцов ;ds:dx - адрес матрицы ShowMatrix proc pusha mov si, dx ; строка (i) - адрес строки матрицы mov ax, Columns mov cx, elSize mul cx mov di, ax ; di - размер строки матрицы mov cx, m ;cx выполняет роль i (0..m-1) @@ForI: mov dx, cx ;сохраняем содержимое счётчика cx (i) mov cx, n ; теперь cx выполняет роль j (0..n-1) mov bx, 0 ;смещение элемента относительно начала строки @@ForJ: mov ax, [si+bx] ;считываем очередной элемент в ax call Show_AX ;вывод числа на экран push dx mov ah, 02h ;вывод пробела на экран mov dl, ' ' int 21h pop dx add bx, elSize ;переход к следующему элементу loop @@ForJ push dx mov ah, 09h ;перевод строки lea dx, asCR_LF int 21h pop dx mov cx, dx add si, di ; si - смещение текущей строки матрицы loop @@ForI popa ret ShowMatrix endp Main proc mov dx, @data mov ds, dx ;вывод матрицы на экран mov ah, 09h lea dx, asMatrix int 21h mov ah, 09h lea dx, asCR_LF int 21h lea dx, S call ShowMatrix ;поиск максимального элемента матрицы, ;расположенного на главной диагонали lea si, S ; строка (i) - адрес строки матрицы mov ax, Columns mov cx, elSize mul cx mov di, ax ; di - размер строки матрицы mov ax, [si] ;Max:=S[0, 0] mov cx, m ;cx выполняет роль i (0..m-1) @@ForI: mov bx, 0 ;смещение элемента относительно начала строки push cx mov cx, n @@ForJ: cmp ax, [si+bx] ;сравниваем очередной элемент с al jge @@Next ;если очередной элемент меньше или равен максимальному ;то переходим к следующему mov ax, [si+bx] ;иначе - обновляем значение максимального элемента @@Next: add bx, elSize ;переход к следующему элементу в строке loop @@ForJ pop cx add si, di ;переход к следующей строке loop @@ForI ;вывод максимального элемента push ax mov ah, 09h lea dx, asMax int 21h pop ax call Show_AX ;завершение программы mov ax, 4c00h int 21h Main endp end Main
Объяснение кода листинга программы
- В начале кода объявляется модель программы - small и используемая версия языка - 486.
- Объявляются переменные и инициализируются:
- 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:
.
- Далее идет процедура Show_AX, которая выводит число из регистра AX на экран.
- Затем следует процедура ShowMatrix, которая выводит переданную матрицу на экран.
- Процедура Main - главная процедура программы, где осуществляется вызов всех остальных процедур.
- Вначале инициализируются регистры dx и ds для работы с данными программы.
- Затем вызывается процедура ShowMatrix для вывода матрицы на экран.
- Далее идет поиск максимального элемента матрицы, расположенного на главной диагонали.
- После этого максимальный элемент выводится на экран с помощью процедуры Show_AX.
- В конце программы происходит завершение программы с помощью системного вызова int 21h с параметром 4c00h.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д