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