[FASM] Сумма первой строки квадратной матрицы - Assembler
Формулировка задачи:
Всем доброго времени суток. Нужна любая помощь в написании программе в FASM.
Объявить квадратную матрицу 8-битную целую без знака и посчитать сумму элементов первой строки этой матрицы.
Решение задачи: «[FASM] Сумма первой строки квадратной матрицы»
textual
Листинг программы
format MZ ;Исполняемый файл DOS EXE (MZ EXE) entry @code:start ;Точка входа в программу stack 200h ;Размер стека ;-------------------------------------------------------------------- segment @data ;Cегмент данных N dw 4 Matrix db 11, 12, 13, 14 db 21, 22, 23, 24 db 31, 32, 33, 34 db 41, 42, 43, 44 ;-------------------------------------------------------------------- segment @code ;Сегмент кода start: ;Точка входа в программу mov ax, @data ;Инициализация регистра DS mov ds, ax mov cx, [N] lea bx, [Matrix] mov si, 0 mov ax, 0 .for: add al, [bx+si] adc ah, 0 add si, 1 loop .for mov bx, 10 ; Делитель mov cx, 0 ;счётчих разрядов ;в цикле получаются остатки от деления на 10, которые сохраняются в стеке ;а также в регистре cx подсчитывается количество цифр. .DivLoop: mov dx, 0 inc cx div bx push dx cmp ax, 0 jnz .DivLoop ;цифры (остатки от деления на 10) извлекаются из стека и, после ;преобразования в символ, выводятся на экран mov ah, 02h .ToStrLoop: pop dx add dl, '0' int 21h loop .ToStrLoop mov ax, 4C00h int 21h ;Завершение программы
Объяснение кода листинга программы
- Формат исполняемого файла DOS EXE (MZ EXE) - исполнительный файл DOS EXE, который содержит в себе машинный код и данные. Данный формат используется для создания исполняемых файлов для операционной системы DOS.
- Точка входа в программу - место, с которого начинается выполнение программы. В данном случае, точка входа установлена на сегмент кода @code:start.
- Размер стека - определяет количество ячеек памяти, которые могут быть использованы для хранения локальных переменных и параметров функций. В данном случае, размер стека составляет 200h (или 8192 байта).
- Сегмент данных - сегмент памяти, в котором хранятся данные программы. В данном случае, сегмент данных установлен на @data.
- Переменная N - содержит значение количества элементов в квадратной матрице. Значение переменной N равно 4.
- Матрица - двумерный массив, представленный в коде как последовательность байтов. Каждый элемент матрицы имеет индекс [row*4 + col], где row - номер строки, а col - номер столбца. В данном случае, матрица состоит из 4 строк и 4 столбцов, и ее элементы равны 11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44.
- Регистр DS - сегмент данных, который используется для доступа к переменным в сегменте данных. В данном случае, регистр DS инициализируется значением сегмента данных @data.
- Цикл получения суммы первой строки квадратной матрицы - цикл, который проходит по каждому элементу первой строки матрицы и суммирует их значения.
- Делитель - переменная, которая содержит значение 10 (для деления на 10).
- Переменная cx - используется в цикле деления для подсчета количества цифр, полученных в результате деления.
- Регистр dx - используется в цикле деления для хранения остатка от деления.
- Регистр ax - используется в цикле деления для хранения результата деления.
- Степ - используется для хранения остатков от деления на 10.
- Переменная si - используется в цикле получения суммы первой строки матрицы для хранения номера элемента.
- Переменная bx - используется в цикле получения суммы первой строки матрицы для хранения номера столбца.
- Регистр ah - используется в цикле вывода остатков от деления на 10 в виде символов.
- Переменная dl - используется в цикле вывода остатков от деления на 10 для хранения младшего бита числа.
- Функция int 21h - используется для вывода символов на экран.
- Конец программы - завершение работы программы, установлен на значение 4C00h.
- Функция int 21h - используется для завершения программы.