Дано целое число х. Получить квадратную матрицу порядка n + 1 - Assembler
Формулировка задачи:
1. Дано целое число х. Получить квадратную матрицу порядка n + 1:
Решение задачи: «Дано целое число х. Получить квадратную матрицу порядка n + 1»
textual
Листинг программы
@stack segment para stack db 1024 dup(?) @stack ends @data segment CrLf db 0Dh, 0Ah, '$' N dw 6 X dw 3 First dw ? Last dw ? @data ends @code segment assume cs:@code, ds:@data, ss:@stack main proc mov ax, @data ; get segment address of data mov ds, ax ; and move it into DS ;заполнение первой строки матрицы mov ax, 1 mov [First], ax mov cx, [N] inc cx FirstLine: mov [Last], ax call Show_AX mul word ptr[X] loop FirstLine mov ah, 09h lea dx, [CrLf] int 21h ;заполнение до предпоследней строки включительно cmp word ptr[N], 1 jb break je ShowLastLine mov cx, [N] sub cx, 1 MiddleLines: mov ax, [First] mul word ptr[X] mov [First], ax call Show_AX push cx mov cx, [N] sub cx, 1 mov ax, 0 Inner: call Show_AX loop Inner pop cx mov ax, [Last] mov dx, 0 div word [X] mov [Last], ax call Show_AX mov ah, 09h lea dx, [CrLf] int 21h loop MiddleLines ;заполнение последней строки ShowLastLine: mov cx, [N] inc cx mov ax, [First] mul word ptr[X] LastLines: call Show_AX mov dx, 0 div word ptr[X] loop LastLines mov ah, 09h lea dx, [CrLf] int 21h ;локальные метки начинаются с точки break: ;завершение программы 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