Сформировать квадратную матрицу по заданному образцу - 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