Проблема доступа к массиву в сборке через элемент данных

Я хочу переместить свой индекс в элемент данных и получить к нему доступ, добавив индекс к начальному адресу массива (mov dx, [bx + i]), но я даю его адрес, а не его значение. Что я должен делать?

  ; This method of array access 
    mov ah,2
lea bx,arr ; load address of DW array
mov i,2 ; DW data member
int 21h
mov dx,[bx + i] ; this line is having problem
add dx,30h
int 21h

person Yousaf Raza    schedule 04.05.2019    source источник
comment
Вот тут я запутался, ассемблер не выдает ни одной серьезной ошибки и ассемблирует успешно. Что происходит вместо того, чтобы указать значение «i», он помещает адрес i   -  person Yousaf Raza    schedule 04.05.2019
comment
Держите свой индекс в реестре, и у вас не будет этой проблемы в первую очередь. Вот для чего нужны регистры.   -  person Peter Cordes    schedule 05.05.2019


Ответы (1)


Вы не можете использовать значение переменной в выражении индекса. Итак, mov dx,[bx + i] недействителен. См. том 2, раздел 2.1.5 на стр. 509 текущего Руководство по разработке программного обеспечения для архитектур Intel 64 и IA-32 для допустимых режимов адресации байта ModR/M (режимы адресации) для 16-битной сборки .

Вот тут я запутался, ассемблер не выдает ни одной серьезной ошибки и ассемблирует успешно. Что происходит вместо того, чтобы указать значение «i», он помещает адрес i

Да. Это правильное (но нежелательное) поведение. Режим адресации этой инструкции [BX]+disp16 = [BX + disp16] с режимом 10111b (см. таблицу, указанную в Руководстве по эксплуатации). Итак, здесь disp16 — это адрес переменной, а не ее значение. Поэтому инструкция использует адрес в качестве индекса. Нет режима адресации для того, чего вы хотите достичь. Вам придется сначала поместить индекс в регистр, а затем использовать соответствующий режим адресации из таблицы.

Так что меняйте строчку

mov dx, [bx + i]   ; this line is having problem

to

mov si, i          ; i is a WORD variable
mov dx, [bx+si]    ; correct addressing mode

Это сгенерирует один правильный режим адресации [BX+SI] = 00000b и 010b для регистра DX. И согласно Рисунок 2.2 на странице 508, байт ModR/M будет

Mod 00......
R/M .....000
Reg ..010...
=== 00010000 = 10h
person zx485    schedule 04.05.2019