Подсчитать сумму элементов двумерного массива - 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. Строки с 1 по 4 содержат значения массива.
  2. В переменной M (10h) содержится количество строк.
  3. В переменной N (11h) содержится количество столбцов.
  4. В переменной C (12h) хранится сумма элементов. Программа выполняет следующие действия:
  5. Инициализирует сегмент данных ds и код cs.
  6. Обнуляет регистры bx, ch, si, ah.
  7. Загружает в bx смещение начала строки (10h).
  8. Загружает в cx счётчик строк (10h).
  9. Начинается цикл по строкам с помощью команды loop Stolb.
  10. В каждой итерации цикла происходит загрузка значения элемента массива в аккумулятор al.
  11. К C прибавляется значение al (сумма элементов).
  12. Происходит инкремент смещения элемента si.
  13. Цикл по элементам строки выполняется с помощью команды loop Strok.
  14. После завершения цикла происходит переход к следующей строке: add bx, ax.
  15. Восстанавливается счётчик строк из стека с помощью команды pop cx.
  16. Цикл по строкам завершается командой loop Stolb.
  17. Программа завершается с помощью команды mov ah, 04ch. Сумма элементов массива хранится в переменной C (12h). Значение переменной C равно 1 + 2 + 4 + 5 = 12.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы