Найти наибольший из элементов матрицы, расположенных на главной диагонали - Assembler
Формулировка задачи:
16 24 0 35
s= 28 5 16 34
55 6 28 1
17 3 101 5
Задана матрица. Найти наибольший из элементов матрицы, расположенных на главной диагонали. Результат сообщения вывести на экран
Решение задачи: «Найти наибольший из элементов матрицы, расположенных на главной диагонали»
textual
Листинг программы
.model small .486 LOCALS @@ .stack 256 .data Metric equ 10 ;система счисления Rows equ 4 ;максимальное количество строк Columns equ 4 ;максимальное количество столбцов arSize equ Rows*Columns ;максимальный размер матрицы elSize equ 1 ;размер одного элемента матрицы m dw Rows ;текущее количество строк n dw Columns ;текущее количество столбцов S db 16, 24, 0, 35 ;матрица db 28, 5, 16, 34 db 55, 6, 28, 1 db 17, 3,101, 5 asCR_LF db 0Dh, 0Ah, '$' ;"перевод строки" asMatrix db 'Matrix S:', '$' asMax db 'Max in diagonal S: ', '$' ; .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, 0 ;считываем очередной элемент в ax mov al, [si+bx] 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 ;поиск максимального элемента матрицы, ;расположенного на главной диагонали mov si, dx ; строка (i) - адрес строки матрицы mov ax, Columns mov cx, elSize mul cx mov di, ax ; di - размер строки матрицы mov bx, 0 ;смещение элемента относительно начала строки mov al, [si+bx] ;Max:=S[0, 0] mov ah, 0 mov cx, m ;cx выполняет роль i (0..m-1) @@ForI: cmp al, [si+bx] ;сравниваем очередной элемент с al jg @@Next ;если очередной элемент меньше или равен максимальному ;то переходим к следующему mov al, [si+bx] ;иначе - обновляем значение максимального элемента @@Next: add si, di ;переход к следующей строке add bx, elSize ;переход к следующему элементу в строке 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д