Проблема доступа к массиву в сборке через элемент данных - PullRequest
0 голосов
/ 04 мая 2019

Я хочу переместить свой индекс в элемент данных и получить к нему доступ, добавив индекс к начальному адресу массива (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

1 Ответ

2 голосов
/ 04 мая 2019

Нельзя использовать значение переменной в выражении индекса. Так что 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

до

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
...