Описать процедуру 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). Выполнить это упражнение при условии, что параметры передаются процедуре через регистры. В этой проге нужно просто написать подпрограмму и описать сумму, которая делает эту подпрограмму) Вот код:
;Процедура 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
Выдает ошибки(Code or data emission to undeclared segment)/2(Unexpected end of file encountered)

Решение задачи: «Описать процедуру 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

Объяснение кода листинга программы

  1. Включение файла io.ASM - подключение стандартного ввода/вывода.
  2. Определение сегмента стека s с размером 256 байт.
  3. Определение сегмента данных d с базовым адресом 100Н.
  4. Определение двумерного массива a размером 10 строк по 10 элементов.
  5. Определение однобайтовых переменных msg и B.
  6. Определение сегмента кода c с базовым адресом 100Н.
  7. Представление процедуры SUM(X, N, S) с тремя параметрами, передаваемыми в регистрах.
  8. Выделение стека для сохранения регистров при вызове процедуры.
  9. Код процедуры SUM, выполняющей сумму элементов массива X по N знаковых байтов, начиная с адреса BX и сохраняющей результат в регистре DX.
  10. Код процедуры start, определяющий сегмент данных и выполняющий вызов процедуры SUM с передачей в нее параметров.
  11. Код процедуры outint SUM, выводящий результат суммы на экран.
  12. Код процедуры finish, определяющий сегмент данных и завершающий выполнение программы.

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


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

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

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