Подсчитать сумму элементов двумерного массива - 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.