Найти максимальный по модулю элемент матрицы, переставить строки/столбцы матрицы по условию - 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

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


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

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

15   голосов , оценка 3.933 из 5
Похожие ответы