Описать процедуру SUM(X, N, S): присвоить параметру слову S сумму элементов массива X из N знаковых байтов - Assembler
Формулировка задачи:
Это задание)))) Дано описание: A DB 100 DUP(?) ; числа со знаком B DW ? Описать близкую процедуру SUM(X, N, S), которая присваивает параметру слову S сумму элементов массива X из N знаковых байтов, и выписать команды, соответствующие следующему обращению к процедуре: SUM(A, 100, B). Выполнить это упражнение при условии, что параметры передаются процедуре через регистры.
В этой проге нужно просто написать подпрограмму и описать сумму, которая делает эту подпрограмму)
Вот код:
Выдает ошибки(Code or data emission to undeclared segment)/2(Unexpected end of file encountered)
;Процедура SUM(X, N, S) ;Параметры передаются в регистрах: ;BX = X - указатель на массив ;CX = N - кол-во элементов массива ;Результат: в регистре DX - сумма элементов массива SUM proc push ax push cx push si mov si, bx xor dx, dx SUMLoop: lodsb cbw add dx, ax loop SUMLoop pop si pop cx pop ax ret SUM endp ;Вызов процедуры lea bx, A mov cx, 100 call SUM mov B, dx
Решение задачи: «Описать процедуру SUM(X, N, S): присвоить параметру слову S сумму элементов массива X из N знаковых байтов»
textual
Листинг программы
include io.ASM s segment stack DB 256 DUP(?) s ends d segment a db 1,2,3,4,5,6,7,8,9,10 db 11,12,13,4,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 msg DB '$' d ends c segment assume CS:c, DS:d, SS:s ;Процедура SUM(X, N, S) ;Параметры передаются в регистрах: ;BX = X - указатель на массив ;CX = N - кол-во элементов массива ;Результат: в регистре DX - сумма элементов массива SUM proc push ax push cx push si mov si, bx xor dx, dx SUMLoop: lodsb cbw add dx, ax loop SUMLoop pop si pop cx pop ax ret SUM endp start: mov ax,d mov ds,ax lea bx, A mov cx, 100 call SUM mov B, dx outint SUM finish c ends
Объяснение кода листинга программы
- Включение файла io.ASM - подключение стандартного ввода/вывода.
- Определение сегмента стека s с размером 256 байт.
- Определение сегмента данных d с базовым адресом 100Н.
- Определение двумерного массива a размером 10 строк по 10 элементов.
- Определение однобайтовых переменных msg и B.
- Определение сегмента кода c с базовым адресом 100Н.
- Представление процедуры SUM(X, N, S) с тремя параметрами, передаваемыми в регистрах.
- Выделение стека для сохранения регистров при вызове процедуры.
- Код процедуры SUM, выполняющей сумму элементов массива X по N знаковых байтов, начиная с адреса BX и сохраняющей результат в регистре DX.
- Код процедуры start, определяющий сегмент данных и выполняющий вызов процедуры SUM с передачей в нее параметров.
- Код процедуры outint SUM, выводящий результат суммы на экран.
- Код процедуры finish, определяющий сегмент данных и завершающий выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д