Найти максимальный по модулю элемент матрицы, переставить строки/столбцы матрицы по условию - Assembler
Формулировка задачи:
помогите пожалуйста. Задана матрица размером n x m. Найти максимальный по модулю элемент матрицы. Переставить строки и столбцы матрицы таким образом, чтобы максимальный по модулю элемент был расположен на пересечении k-й строки и k-го столбца. на Ассемблере
Решение задачи: «Найти максимальный по модулю элемент матрицы, переставить строки/столбцы матрицы по условию»
textual
Листинг программы
@stack segment para stack db 1024 dup(?) @stack ends @data segment N dw 4 M dw 5 K dw 3 Matrix dw 12, 88, 64, 52, -17 dw -52, -7, -14, 98, 18 dw 78, -16, 17, -91, -99 dw 10, 87, 62, 63, -67 RowMax dw ? ColMax dw ? MaxAbs dw ? MsgIMtr db 'Initial matrix:', 0Dh, 0Ah, '$' MsgMax db 'Max abs:', '$' MsgRow db 'Row: ', '$' MsgCol db 'Column: ', '$' MsgK db 'K: ', '$' MsgRMtr db 'Result matrix:', 0Dh, 0Ah, '$' CrLf db 0Dh, 0Ah, '$' @data ends @code segment assume cs:@code, ds:@data, ss:@stack main proc ;инициализация сегментного регистра данных mov ax, @data mov ds, ax ;поиск максимального по модулю элемента матрицы mov si, [N] mov di, [M] lea dx, [Matrix] call GetMaxAbs mov [MaxAbs],ax mov [RowMax],si mov [ColMax],di ;вывод результата mov ah, 09h lea dx, [MsgIMtr] int 21h lea dx, [Matrix] mov bx, [M] mov cx, [N] call ShowMatrix mov ah, 09h lea dx, [MsgMax] int 21h mov ax, [MaxAbs] call Show_AX mov ah, 09h lea dx, [CrLf] int 21h mov ah, 09h lea dx, [MsgRow] int 21h mov ax, RowMax call Show_AX mov ah, 09h lea dx, [CrLf] int 21h mov ah, 09h lea dx, [MsgCol] int 21h mov ax, [ColMax] call Show_AX mov ah, 09h lea dx, [CrLf] int 21h mov ah, 09h lea dx, [MsgK] int 21h mov ax, [K] call Show_AX mov ah, 09h lea dx, [CrLf] int 21h call SwapRows call SwapColumns mov ah, 09h lea dx, [MsgRMtr] int 21h lea dx, [Matrix] mov bx, [M] mov cx, [N] call ShowMatrix ;завершение программы mov ax, 4C00h int 21h main endp ;Поиск максимального по модулю элемента матрицы ;на входе: ; ds:dx - адрес матрицы ; si - количество строк ; di - количество столбцов ;на выходе: ; ax - максимальный по модулю элемент ; si - номер строки (от 0) с максимальным по модулю элементом ; di - номер столбца (от 0) с максимальным по модулю элементом GetMaxAbs proc ;push ax push bx push cx push dx ;push si ;push di push dx push di mov bx, dx mov ax, si ;cx:=N*M mul di mov cx, ax mov dx, 0 ;MaxAbs:=0 mov si, 0 ;i:=0 mov di, si ;Imax:=0 @@ForI: mov ax, [bx] neg ax jl $-2 cmp ax, dx jbe @@Next mov dx, ax mov di, si @@Next: add bx, 2 inc si loop @@ForI pop cx ;cx:=M mov ax, di mov dx, 0 div cx mov cx, di ;cx:=Imax mov di, dx mov si, ax pop bx shl cx, 1 add bx, cx mov ax, [bx] ;pop di ;pop si pop dx pop cx pop bx ;pop ax ret GetMaxAbs endp SwapRows proc lea bx, [Matrix] mov ax, [K] cmp ax, [RowMax] je @@srExit mov ax, [M] shl ax, 1 mov cx, ax mul [K] mov si, ax mov ax, [RowMax] mul cx mov di, ax mov cx, [M] @@srFor: mov ax, [bx+si] xchg ax, [bx+di] mov [bx+si],ax add si, 2 add di, 2 loop @@srFor @@srExit: ret SwapRows endp SwapColumns proc lea bx, [Matrix] mov ax, [K] cmp ax, [ColMax] je @@scExit mov ax, [M] shl ax, 1 mov dx, ax mov si, [K] shl si, 1 mov di, [ColMax] shl di, 1 mov cx, [N] @@scFor: mov ax, [bx+si] xchg ax, [bx+di] mov [bx+si],ax add si, dx add di, dx loop @@scFor @@scExit: ret SwapColumns endp ;Вывод на экран матрицы слов ;на входе: ; ds:dx - адрес матрицы ; bx - количество столбцов в матрице ; cx - количество строк в мматрице ;на входе: ; - ShowMatrix proc push ax push bx push cx push dx push si push di pushf jcxz @@smExit or bx, bx jz @@smExit cld mov cx, cx mov si, dx @@smForI: push cx push bx mov cx, bx @@smForJ: lodsw call Show_AX loop @@smForJ mov ah, 09h lea dx, [CrLf] int 21h pop bx pop cx loop @@smForI @@smExit: popf pop di pop si pop dx pop cx pop bx pop ax ret ShowMatrix endp ; выводит знаковое 16-разрядное число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push si push di mov cx, 10 ;основание системы счисления xor di, di ; di - кол. цифр в числе xor si, si ; si - признак отрицательного числа ; если число в ax отрицательное, то ;1) напечатать (запомнить в стеке) символ '-' ;2) сделать ax положительным or ax, ax jns @@Conv mov si, 1 neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стек or ax, ax jnz @@Conv ;если число отрицательное - помещаем символ "-" в строку or si, si jz @@Positive mov dx, '-' push dx inc di @@Positive: ; выводим из стека на экран ; - сначала пробелы для выравнивания по правому краю mov cx, 8 sub cx, di mov ah, 02h mov dl, ' ' @@LeftPad: int 21h loop @@LeftPad ;сохранённые символы цифр @@Show: pop dx ; dl = очередной выводимый символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop si pop dx pop cx pop bx pop ax ret Show_AX endp @code ends end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д