Как хранить элементы массива по адресам памяти в 8086 - PullRequest
2 голосов
/ 23 октября 2019

Вот вопрос Я пытаюсь написать программу на emu8086. Эта программа об операциях с памятью и массивах. Операции передачи памяти должны выполняться в сегменте данных. И я должен хранить свои элементы по адресам памяти. (Например: от DS: [2000h] до DS: [2009h])

    data segment   
    arr db 1,2,3,4,5,6,7,8,9,10  
    ends

code segment  
start:

    xor ax  , ax 
    lea si ,arr

    mov cx , 10   
add: 
    add ax,[si]
    add si,2
    loop add 
ends

Я запутался в адресации элементов массива.

1 Ответ

1 голос
/ 24 октября 2019

Расчет суммы будет правильным, как только вы измените размеры данных на BYTE.

 xor  al, al
 lea  si, arr
 mov  cx, 10
Sum:
 add  al, [si]
 inc  si
 loop Sum

Я запутался насчет адресации элементов массива.

Для адресации памяти вам необходимо настроить регистр сегмента и указать смещение (в основном это регистр адресов, например SI, DI или BX).
Для хранения массива и суммы в DS: [2000h], вам нужно сначала настроить сегментный регистр DS. А поскольку вам нужно одновременно обращаться к массиву в его первоначальном месте, вам нужно настроить 2 сегментных регистра.

mov ax, data    ;Source is the array in the program
mov es, ax
mov ax, 3000h   ;Destination is the designated memory
mov ds, ax

Мы можем перемещать массив и вычислять сумму одновременно!

 xor  al, al
 lea  si, arr     ;Source offset (using ES)
 mov  di, 2000h   ;Destination offset (using DS)
 mov  cx, 10
MoveAndSum:
 mov  dl, es:[si]
 inc  si
 mov  [di], dl
 inc  di
 add  al, dl
 loop MoveAndSum
 mov  [di], al    ;Store the sum at DS:[200Ah]    ?????

Исходное описание задачи говорит вам хранить сумму в DS:[2010h]

Это , а не , что показывает прилагаемый чертеж!

Возможно, вам придется написать mov [2010h], al вместо mov [di], al.

...