Объявить массив из адресов - 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

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

  1. Объявляется модель памяти small
  2. Объявляется сегмент данных, в котором будет размещен массив
  3. В сегменте данных объявляются переменные:
    • a - массив из адресов
    • n - переменная для хранения размера массива
    • summa - переменная для хранения суммы элементов массива
  4. Размер массива вычисляется как половина разницы между текущим адресом стека и адресом первого элемента массива
  5. В сегменте данных инициализируются элементы массива a значениями от 1 до 6
  6. В сегменте кода подключается процедура sum, которая будет вычислять сумму элементов массива
  7. В регистре AX сохраняется адрес последнего элемента массива
  8. Вызывается процедура sum с передачей в стек адреса последнего элемента массива
  9. В регистре AX сохраняется результат работы процедуры sum (сумма элементов массива)
  10. Результат вычисления суммы записывается в переменную summa
  11. В регистре AX и DX обнуляются значения для корректного выхода из процедуры sum
  12. В регистре BX сохраняется адрес начала массива
  13. Начинается цикл вычисления суммы элементов массива:
    • В регистре SI хранится адрес текущего элемента массива
    • Из регистра SI в регистр DL считывается значение текущего элемента массива
    • К регистру AX прибавляется значение из регистра DL
    • К регистру BX прибавляется 2 (переход к следующему элементу массива)
    • Если условие loop истинно (не равно нулю), то цикл продолжается
  14. После окончания цикла в регистре AX будет содержаться сумма элементов массива
  15. Процедура sum завершается возвратом в точку вызова (код после вызова процедуры sum)
  16. Результат суммы элементов массива записывается в переменную summa
  17. В регистре AX обнуляется значение для корректного выхода из процедуры sum
  18. В регистре DX обнуляется значение для корректного выхода из процедуры sum
  19. Выполняется переход на 16-й переход (выполнение команды int 16h)
  20. Завершение работы программы выполняется командой int 21h

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


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

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

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