Квадратная матрица чисел из диапазона 0..9999 размерностью [1..N; 1..N] вводится с клавиатуры по строкам, где N — число из диапазона 1..9, вводимое с клавиатуры . Вывести на экран результат сложения введенной матрицы с транспонированной введенной матрицей.
Программа должна быть написана на языке Ассемблера(tasm).
Есть наработки, но проблема со считыванием и выводом, а так же нужно реализовать суммирование
Код:
.model small
.186
.code
begin:
;Адресуем сегментные регистры
mov ax,@data
mov ds,ax
mov es,ax
mov ah, 01h
int 21h
cmp al, 0dh ;проверка окончания ввода по Enter
je label1
xor ah, ah
sub al, '0'
mov n, ax
label1:
call ReadArray ;считываем массив во второй
;Выводим исходную матрицу
;call OutMatrix
;Транспонируем матрицу
call TranspMatrix
;Выводим полученный результат
call OutMatrix
;Ожидаем любую клавишу и завершаем программу
xor ax,ax
int 16h
mov ax,4c00h
int 21h
;
ReadArray proc near
mov cx, n
fl2:
push cx
mov bx, cx
neg bx
add bx, n;индекс строки
mov i, bl
mov cx, n
fl3:
push cx
mov bl, i;номер строки
neg cx
add cx, n ;номер столбца
mov ax, n
mul bl
add ax, cx
mov si, ax ;индекс смещения
;первый символ
mov cx, 4
fl5:
mov ah, 01h
int 21h
cmp al, 20h
je fl4; если пробел, то выходим
sub al, '0'
mov dl, al
loop fl5
xor ah, ah
push ax
mov al, 10
mul dl
mov dx, ax
pop ax
add dx, ax ;в dx введенное число
fl4:
mov matrix[si], dl
mov dl, 20h ;разделяем пробелами
mov ah, 02h
int 21h
pop cx
loop fl3
pop cx
mov dl, 10 ;переводим на новую строку
mov ah, 2h
int 21h
mov dl, 13 ;возвращаем каретку
mov ah, 2h
int 21h
loop fl2
mov dl, 10
mov ah, 2h
int 21h
mov dl, 13
mov ah, 2h
int 21h
ret
ReadArray endp
;Вывод матрицы
;устанавливаем внешний индекс цикла
OutMatrix: mov cx,4
;сбрасываем указатель в матрице
xor si,si
;запоминаем его в стеке
OM1: push cx
;устанавливаем внутренний индекс цикла
mov cx,4
;считываем значение числа
OM2: mov al,[Matrix+si]
;переходим к следующему числу
inc si
;выводим число на экран
call OutNumber
;проверяем внутренний цикл
loop OM2
;переходим на новую строку
call NewLine
;востанавливаем внешний индекс цикла
pop cx
;проверяем внешний индекс цикла
loop OM1
;переходим на новую строку
NewLine: mov al,10
int 29h
mov al,13
int 29h
;возвращаемся из под програмы
ret
;
;Выводим одно число в АХ
;запоминаем счетчик цикла в стеке
OutNumber: push cx
;система счисления, в данном случае 10-ая
mov bx,10
;сбрасываем старшую часть слова
xor ah,ah
;сбрасываем счетчик цифр
xor cx,cx
;сбрасываем остаток
ON1: xor dx,dx
;длелим на систему счисления и получаем остаток от деления
div bx
;запоминаем остаток в стеке
push dx
;считаем запомненую цифру
inc cx
;посторяем пока АХ больше нуля
or ax,ax
jnz ON1
;форматируем вывод чисел
;значение, которое при +30Н даст код пробела
mov ax,-10h
;увеличиваем счетчик цифр в стеке
ON2: inc cx
;запоминаем в стеке условный код пробела
push ax
;повторяем пока в стеке не будет 4-е цифры
cmp cx,4
jnz ON2
;выводим число на экран
;извлекаем из стека очередную цифру
ON3: pop ax
;переводим в символьный код для вывода на экран
add al,30h
;выводим на экран символ
int 29h
;повторяем пока в стеке есть цифры
loop ON3
;востанавливаем счетчик цикла
pop cx
ret
;
;трнспонируем матрицу
;устанавливаем индекс внешнего цикла
TranspMatrix:
xor bx,bx ;база строки
xor si,si ;смещение элемента в строке
xor di,di ;смещение транспонированного элемента
TM1: ;цикл по строкам верхнего треугольника
push si ;сохраним индекс в строке
push di ;сохраним смещение транспонированного элемента
TM2: ;цикл по элементам строки верхнего треугольника
inc si ;диагональный элемент обходим
add di,N ;аналогично для второго элемента
cmp si,N ;дошли до края строки?
je TM3 ;да - переходим на следующую
;обмениваем элементы
mov al,[Matrix+bx+si]
xchg [Matrix+di],al
mov [Matrix+bx+si],al
jmp TM2 ;на слеующий элемент в строке
TM3: ;переход на следующую строку
pop di ;восстановим индексы
pop si
add bx, N ;переходим на слеующую строку
inc si ;и смещаемся на одну позицию вправо
;(рассматриваем только верхний треугольник)
add di, N+1 ;смещаемся на одну строку вниз и на одну позицию вправо
;(соответствующая позиция в нижнем треугольнике)
cmp bx, 4 ;дошли до последней строки?
jne TM1 ;нет - на отраотку строки
ret
;сегмент данных
.data
Matrix db 81 dup (?)
array2 db 16 dup (?)
arrayResult dw 16 dup (0)
i db 1 dup (0)
j db 1 dup (0)
a db 1 dup (0)
b db 1 dup (0)
n dw ? ;размерность
;сегмент стека
.stack 100h
;точка входа в программу
end begin