Подсчитать сумму элементов двумерного массива - Assembler
Формулировка задачи:
Здравствуйте. Нужно посчитать сумму элементов двумерного массива, а затем вывести результат на экран. Сама функция вывода у меня есть в программе, но работает она не правильно, думаю что нужно использовать коррекцию, но не совсем разобрался. Прошу помочь.
cseg segment 'code' assume cs:cseg, ds:dseg org 100h main proc mov ax, dseg ; указывает на регистр данных mov ds, ax ; указывает на регистр данных xor bx, bx; обнуление смещение начала строки ? xor ch, ch; обнуление старшей половины счетчика строк ? mov cl, M; загрузка в счетчик кол-ва строк Stolb: xor si, si; обнуление смещения элемента от начала строки push cx; сохранение счетчика строк в стеке mov cl, N; загрузка в счётчик кол-ва столбцов Strok: mov al, mas[bx][si]; загрузка в аккум текущего элемента Call Write inc si loop Strok; цикл по элементам строки xor ah, ah mov al, N add bx, ax; переход к след строке pop cx; восстановление счётчика строк из стека loop Stolb; цикл по строкам Exit: mov ah, 04ch; выход из программы (функция DOS) mov al, 0h; код возврата int 21h; ret; возвращаем управление отладчику Write proc mov ah, 02h int 21h ret Write ENDP main endp dseg segment mas db 01h,02h db 04h,05h M db 2; кол-во строк N db 2; кол-во столбцов dseg ends cseg ends stk segment stack dw 256 dup (0) stk ends end main
Решение задачи: «Подсчитать сумму элементов двумерного массива»
textual
Листинг программы
cseg segment 'code' assume cs:cseg, ds:dseg org 100h main proc mov ax, dseg ; указывает на регистр данных mov ds, ax ; указывает на регистр данных xor bx, bx; обнуление смещение начала строки ? mov C, bx xor ch, ch; обнуление старшей половины счетчика строк ? mov cl, M; загрузка в счетчик кол-ва строк Stolb: xor si, si; обнуление смещения элемента от начала строки push cx; сохранение счетчика строк в стеке mov cl, N; загрузка в счётчик кол-ва столбцов Strok: mov al, mas[bx][si]; загрузка в аккум текущего элемента add C, ax; C=c+a[i,j] inc si loop Strok; цикл по элементам строки xor ah, ah mov al, N; загрузка кол-ва столбцов add bx, ax; переход к след строке pop cx; восстановление счётчика строк из стека loop Stolb; цикл по строкам Exit: mov ah, 04ch; выход из программы (функция DOS) mov al, 0h; код возврата int 21h; ret; возвращаем управление отладчику main endp dseg segment mas db 1,2 db 4,5 M db 2; кол-во строк N db 2; кол-во столбцов C dw ? dseg ends cseg ends stk segment stack dw 256 dup (0) stk ends end main
Объяснение кода листинга программы
В коде на языке Assembler скомпилирована программа для подсчёта суммы элементов двумерного массива.
- Строки с 1 по 4 содержат значения массива.
- В переменной
M
(10h) содержится количество строк. - В переменной
N
(11h) содержится количество столбцов. - В переменной
C
(12h) хранится сумма элементов. Программа выполняет следующие действия: - Инициализирует сегмент данных
ds
и кодcs
. - Обнуляет регистры
bx
,ch
,si
,ah
. - Загружает в
bx
смещение начала строки (10h). - Загружает в
cx
счётчик строк (10h). - Начинается цикл по строкам с помощью команды
loop Stolb
. - В каждой итерации цикла происходит загрузка значения элемента массива в аккумулятор
al
. - К
C
прибавляется значениеal
(сумма элементов). - Происходит инкремент смещения элемента
si
. - Цикл по элементам строки выполняется с помощью команды
loop Strok
. - После завершения цикла происходит переход к следующей строке:
add bx, ax
. - Восстанавливается счётчик строк из стека с помощью команды
pop cx
. - Цикл по строкам завершается командой
loop Stolb
. - Программа завершается с помощью команды
mov ah, 04ch
. Сумма элементов массива хранится в переменнойC
(12h). Значение переменнойC
равно 1 + 2 + 4 + 5 = 12.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д