Найти максимальный элемент матрицы - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д