Сложение двух матриц - Assembler
Формулировка задачи:
Кто сможет написать код программы на TASM , в которой две матрицы(заданные в коде) будут складываться,а результат будет выводится на экран?
Решение задачи: «Сложение двух матриц»
textual
Листинг программы
LOCALS
.model small
.stack 100h
.data
CrLf db 0Dh, 0Ah, '$'
M equ 4
N equ 7
A dw -100, 123, 777, -561, 891, -222, -99
dw 147, 564, -85, -753, 243, 478, 557
dw 72, 64, 11, 88, -49, 69, 57
dw 951, -22, -33, -210, 79, 111, 232
B dw 1, 2, 3, 5, 4, 7, 9
dw -4, -8, 100, -645, 555, -222, 88
dw 36, 36, -36, 366, 362, 542, 36
dw -77, 444, 333, -111, -54, 444, 361
C dw M*N dup(?)
String db 256 dup(?)
Pads db 10 dup(' ') ;пробелы для выравнивния выводимых чисел
RPad equ 7 ;выравнивание чисел вправо на 7 позиций
.code
main proc
mov ax, @data
mov ds, ax
lea si, A
lea di, B
lea bx, C
mov cx, M*N
ForIJ:
mov ax, [si]
add ax, [di]
mov [bx], ax
add si, 2
add di, 2
add bx, 2
loop ForIJ
lea dx, C
call ShowMatrix
mov ax, 4C00h
int 21h
main endp
; преобразует число из регистра AX в строку
; входные данные:
; ax - число для отображения
; ds:dx - адрес для результирующей строки Pascal типа
Int16ToStr proc
push ax
push bx
push cx
push dx
push di
push si
mov si, dx
mov [si], byte ptr 0 ;текущая длина строки равна 0
mov cx, 10
xor di, di ; di - кол. цифр в числе
; если число в ax отрицательное, то
;1) увеличить длину строки на 1
;2) первый символ в строке '-'
;3) сделать ax положительным
or ax, ax
jns @@Conv
inc byte ptr [si]
mov [si+1], byte ptr '-'
neg ax
@@Conv:
xor dx, dx
div cx ; dl = num mod 10
add dl, '0' ; перевод в символьный формат
inc di
push dx ; складываем в стек
or ax, ax
jnz @@Conv
; выводим из стека в строку
mov ax, 0
mov al, [si] ;в ячейку с длиной записываем длину строки
add [si], di ;с учётом возможного символа знака
inc si ;устанавливаем указатель на первую свободную ячейку
add si, ax
@@Show:
pop dx ; dl = очередной символ
mov [si], dl
inc si
dec di ; повторяем пока di<>0
jnz @@Show
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
Int16ToStr endp
; На входе
;m - количество строк
;n - количество столбцов
;ds:dx - адрес матрицы слов
ShowMatrix PROC
push ax
push bx
push cx
push dx
push si
push di
mov si, 0 ; строка
mov di, 0 ; столбец
mov cx, dx
@@ShowRow:
mov dx, 0
mov ax, n*2
mul si
mov bx, ax
add bx, cx
mov ax, [bx+di]
push si
push cx
;преобразование числа в строку
lea dx, String
call Int16ToStr
;вывод выравнивающих пробелов
mov cl, RPad
sub cl, [String]
mov ch, 0
lea si, Pads
call ShowSubStr
;вывод строки с числом
lea si, String+1
mov cl, String
mov ch, 0
call ShowSubStr
pop cx
pop si
add di, 2
cmp di, n*2
jb @@ShowRow
lea dx, CrLf
mov ah, 09h
int 21h
mov di, 0
inc si
cmp si, m
jb @@ShowRow
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
ShowMatrix ENDP
;процедура вывода подстроки
;на входе:
; ds:si - адрес первого символа подстроки
; cx - длина выводимой подсторки
ShowSubStr proc
push ax
push bx
push cx
push dx
mov ah, 40h ;вывод в файл
mov bx, 1 ;файл - консоль
mov cx, cx ;количество символов
mov dx, si ;адрес первого символа
int 21h
pop dx
pop cx
pop bx
pop ax
ret
ShowSubStr endp
end main
Объяснение кода листинга программы
- Создание локальных переменных и объявление модели и стэка.
- Определение данных:
- CrLf - последовательность 0Dh, 0Ah, '$'
- M - константа равная 4
- N - константа равная 7
- A - массив из чисел типа слово
- B - массив из чисел типа слово
- C - массив из M*N элементов неопределенного значения
- String - массив из 256 элементов неопределенного значения
- Pads - массив из 10 элементов, каждый из которых равен пробелу
- RPad - константа, равная 7
- Код:
- Начало функции main
- Загрузка сегмента данных в регистр AX и установка его в регистр DS
- Переменные-указатели si, di, и bx устанавливаются на A, B, и C соответственно
- Вычисление суммы значений A и B и сохранение результата в C внутри цикла ForIJ
- Вызов функции ShowMatrix для отображения матрицы C
- Завершение программы с помощью вызова прерывания 21h функции 4C00h
- Процедура Int16ToStr:
- Преобразование числа в регистре AX в строку
- Процедура ShowMatrix:
- Печать содержимого матрицы C
- Процедура ShowSubStr:
- Печать подстроки Данный код, предположительно, выполняет сложение двух матриц и выводит результат на экран.