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