Сложение двух матриц - 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:
- Печать подстроки Данный код, предположительно, выполняет сложение двух матриц и выводит результат на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д