Сформировать квадратную матрицу по заданному образцу - Assembler (246013)

Узнай цену своей работы

Формулировка задачи:

задача на массивы(матрица),никак не могу решить Сформировать квадратную матрицу порядка n по заданному образцу

Решение задачи: «Сформировать квадратную матрицу по заданному образцу»

textual
Листинг программы
@stack  segment para stack
        db      1024 dup(?)
@stack  ends
 
@data   segment
        N       dw      7
        Matrix  dw      100 dup(?)
        Sum     dw      ?
        RowMin  dw      ?
        Min     dw      ?
        MsgMin  db      'Min:                   ', '$'
        MsgRow  db      'In Row (form 0 based): ', '$'
        MsgSum  db      'Summa:                 ', '$'
        CrLf    db      0Dh, 0Ah, '$'
@data   ends
 
@code   segment
        assume  cs:@code, ds:@data, ss:@stack
main    proc
        ;инициализация сегментного регистра данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;заполнение матрицы по образцу
        lea     di,     [Matrix]
        mov     si,     0
        mov     cx,     [N]
        @@FillForI:
                mov     dx,     1
                push    cx
                mov     cx,     [N]
                @@FillForJ:
                        mov     bx,     [N]
                        inc     bx
                        mov     ax,     si
                        add     ax,     dx
                        cmp     ax,     bx
                        mov     bx,     0
                        sbb     bx,     0
                        and     ax,     bx
                        mov     [di],   ax
                        add     di,     2
                        call    Show_AX
                        inc     dx
                loop    @@FillForJ
                mov     ah,     09h
                lea     dx,     [CrLf]
                int     21h
 
                pop     cx
                inc     si
        loop    @@FillForI
 
        ;поиск строки с наименьшим элементом
        mov     ax,     [N]
        mov     cx,     2
        mul     cx
        mov     dx,     ax      ;dx - размер строки матрицы
        lea     bx,     [Matrix]
        mov     ax,     [bx]            ;Min:=Matrix[0,0]   - т.е. ax это Min
        mov     di,     0               ;RowMin:=0
        mov     [RowMin],       di
        mov     cx,     [N]                             ;for i:=0 to N-1
        @@ProcessForI:
                mov     si,     0                       ;  for j:=0 to N-1
                push    cx
                mov     cx,     [N]
                @@ProcessForJ:
                        cmp     ax,     [bx+si]         ;    if Min>Matrix[i,j]
                        jle     @@ProcessNextJ          ;    then
                        mov     [RowMin],       di      ;      RowMin:=i
                        mov     ax,     [bx+si]         ;      Min:=Matrix[i,j]
                @@ProcessNextJ:
                        add     si,     2       ;  j:=j+1
                loop    @@ProcessForJ
                pop     cx
                add     bx,     dx      ;i:=i+1
                inc     di
        loop    @@ProcessForI
        ;сохранение результатов
        mov     [Min],  ax
        ;вычисление суммы строки с минимальным элементом
        lea     bx,     [Matrix]
        mov     ax,     [RowMin]        ;адрес строки равен номеру,
        mul     dx                      ;умноженному на размер строки
 
        mov     si,     ax
        mov     ax,     0               ;Sum:=0
        mov     cx,     [N]
        @@ForSum:
                add     ax,     [bx+si]
                add     si,     2
        loop    @@ForSum
        mov     [Sum],  ax
        ;вывод результата
        mov     ah,     09h
        lea     dx,     [MsgMin]
        int     21h
        mov     ax,     [Min]
        call    Show_AX
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
 
        mov     ah,     09h
        lea     dx,     [MsgRow]
        int     21h
        mov     ax,     RowMin
        call    Show_AX
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
 
        mov     ah,     09h
        lea     dx,     [MsgSum]
        int     21h
        mov     ax,     [Sum]
        call    Show_AX
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
        ;завершение программы
        mov     ax,     4C00h
        int 21h
main    endp
; выводит знаковое 16-разрядное число из регистра AX на экран
; с выравниванием на 8 позиций по правому краю
; входные данные:
; 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

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

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