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