Объявить массив из адресов - Assembler
Формулировка задачи:
Помогите пожалуйста.программа работает,но некорректно,нужно объявить массив из адресов.
Описать близкую процедуру SUM, которой через регистр BX передается начальный адрес,а через регистр CX — число элементов некоторого массива, элементы которого (размером в слово) являются адресами каких-то знаковых байтов в сегменте данных. Процедура должна найти сумму значений всех этих байтов и вернуть ответ через регистр AX.
include io.asm .model small .stack 100h .data A db 1,2,3,4,5,6,7,8,9,10 db 11,12,13,14,15,16,17,18,19,20 db 21,22,23,24,25,26,27,28,29,30 db 31,32,33,34,35,36,37,38,39,40 db 41,42,43,44,45,46,47,48,49,50 db 51,52,53,54,55,56,57,58,59,60 db 61,62,63,64,65,66,67,68,69,70 db 71,72,73,74,75,76,77,78,79,80 db 81,82,83,84,85,86,87,88,89,90 db 91,92,93,94,95,96,97,98,99,100 N DW 100 DUP(?) .code ;BX = A - указатель на массив ;CX = N - кол-во элементов массива SUM PROC xor ax,ax ;обнуляем ax, будет храниться сумма xor dx,dx ;обнуляем dx, куда временно будем записывать эл-т из массива l1: mov dl, [bx] ;записываем эл-т из массива add ax, dx ;прибавляем эл-т к обзей сумме inc bx ;увеличиваем bx loop l1 ret SUM ENDP main proc start: mov ax,@data mov ds,ax lea bx,A mov cx,N call SUM ;вызываем процедуру SUM outint ax mov ah,4ch int 21h main endp end main
Решение задачи: «Объявить массив из адресов»
textual
Листинг программы
model small .data a dw offset a1 dw offset a2 dw offset a3 dw offset a4 dw offset a5 dw offset a6 n = ($-a)/2 a1 db 1 a2 db 2 a3 db 3 a4 db 4 a5 db 5 a6 db 6 summa dw ? .stack 256 .code start: mov ax,@data mov ds,ax ; lea bx,a mov cx,n ; call sum mov summa,ax ; xor ax,ax int 16h ; mov ax,4c00h int 21h sum: xor ax,ax xor dx,dx @@01: mov si,[bx] mov dl,[si] add ax,dx add bx,2 loop @@01 ret end start
Объяснение кода листинга программы
- Объявляется модель памяти
small
- Объявляется сегмент данных, в котором будет размещен массив
- В сегменте данных объявляются переменные:
a
- массив из адресовn
- переменная для хранения размера массиваsumma
- переменная для хранения суммы элементов массива
- Размер массива вычисляется как половина разницы между текущим адресом стека и адресом первого элемента массива
- В сегменте данных инициализируются элементы массива
a
значениями от 1 до 6 - В сегменте кода подключается процедура
sum
, которая будет вычислять сумму элементов массива - В регистре AX сохраняется адрес последнего элемента массива
- Вызывается процедура
sum
с передачей в стек адреса последнего элемента массива - В регистре AX сохраняется результат работы процедуры
sum
(сумма элементов массива) - Результат вычисления суммы записывается в переменную
summa
- В регистре AX и DX обнуляются значения для корректного выхода из процедуры
sum
- В регистре BX сохраняется адрес начала массива
- Начинается цикл вычисления суммы элементов массива:
- В регистре SI хранится адрес текущего элемента массива
- Из регистра SI в регистр DL считывается значение текущего элемента массива
- К регистру AX прибавляется значение из регистра DL
- К регистру BX прибавляется 2 (переход к следующему элементу массива)
- Если условие
loop
истинно (не равно нулю), то цикл продолжается
- После окончания цикла в регистре AX будет содержаться сумма элементов массива
- Процедура
sum
завершается возвратом в точку вызова (код после вызова процедурыsum
) - Результат суммы элементов массива записывается в переменную
summa
- В регистре AX обнуляется значение для корректного выхода из процедуры
sum
- В регистре DX обнуляется значение для корректного выхода из процедуры
sum
- Выполняется переход на 16-й переход (выполнение команды
int 16h
) - Завершение работы программы выполняется командой
int 21h
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д