Дан линейный массив x1, x2,., xn-1, xn. Получить целочисленную квадратную матрицу порядка n: - Assembler
Формулировка задачи:
Дан линейный массив x1, x2,., xn-1, xn. Получить целочисленную квадратную матрицу порядка n:
Решение задачи: «Дан линейный массив x1, x2,., xn-1, xn. Получить целочисленную квадратную матрицу порядка n:»
textual
Листинг программы
.model tiny .code org 100h start: jmp main N dw 5 Matrix dw 25 dup(?) Array dw -2, 3, -3, 7, 6 CrLf db 0Dh, 0Ah, '$' main: ;копирование первой строки матрицы из массива mov ax, ds mov es, ax lea si, [Array] lea di, [Matrix] mov cx, [N] rep movsw ;формирование остальных строк матрицы ;si - указатель на предыдущую строку матрицы ;di - указатель на текущую (формируемую) строку матрицы lea si, [Matrix] mov ax, [N] shl ax, 1 mov di, si add di, ax ;bx - указатель на массив lea bx, [Array] ;cx=(n-1) - количество заполняемых строк mov cx, [N] dec cx @@ForI: push cx mov cx, [N] @@ForJ: lodsw mul word ptr[bx] stosw add bx, 2 loop @@ForJ mov ax, [N] shl ax, 1 sub bx, ax pop cx loop @@ForI ;вывод на экран mov cx, [N] mov bx, [N] lea dx, [Matrix] call ShowMatrix ;завершение программы int 20h ;Вывод на экран матрицы слов ;на входе: ; 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 end start
Объяснение кода листинга программы
Код выполняет следующие действия:
- Копирует первую строку матрицы из массива в матрицу.
- Формирует остальные строки матрицы.
- Выводит матрицу на экран.
- Завершает программу.