Базирование и косвенные адреса

Правило использования косвенной адресации:

  • если 1-ый операнд содержит косвенный адрес, то 2-ой операнд ссылается на регистр или непосредственное значение;
  • если 2-ой операнд содержит косвенный адрес, то 1-ый операнд ссылается на регистр.

Существует 2 варианта косвенной адресации ячеек ОП:

  • косвенная обычная, когда исполнительных адрес находится в регистре, например:

MOV AX, [BX].

 

Исполнительный адрес операнда может находиться в базовом регистре BX, регистре указателя базы BP или индексном регистре SI или DI. Косвенный регистровый операнд заключается в квадратные скобки, что означает "в качестве адреса брать содержимое того адреса, на который указывает заключенный в квадратные скобки регистр". Чтобы адрес-смещение переменной мог оказаться в РОН, используется команда пересылки следующего вида:

 

MOV BX, offset SOURCE.

 

Функции этой команды заключаются в том, что смещение (offset) ячейки памяти с именем SOURCE помещается в РОН ВХ. Естественно, в программе эта команда должна предшествовать команде пересылки с косвенной адресацией.

Т.к. содержимое регистра легко изменить в ходе выполнения программы, данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды. Это свойство применяется для организации циклических вычислений и для работы со структурами данных типа таблиц и массивов.

Так, командами

 

MOV BX, offset SOURCE

M1: MOV AX, [BX]

INC BX

INC BX

 

возвращаясь в цикле на метку М1 можно организовать последовательную пересылку в регистр АХ всех элементов массива SOURCE.

 

Еще пример. Пусть в сегменте данных описан вектор TABL DB 12,15,16,10,8,2,5,0.

Ниже первая команда загружает адрес вектора TABL в базовый регистр ВХ, а следующая команда заменяет первый байт в векторе на нулевое значение:

 

MOV BX,OFFSET TABL

MOV BYTE PTR [BX],0

 

после выполнения этих программных инструкций содержимое вектора будет: TABL DB 0,15,16,10,8,2,5,0.

  • косвенная с индексированием - адресация от предыдущей отличается тем, что исполнительный адрес берется в виде суммы адресов, находящихся в базовом и индексном регистрах:

MOV AX, [BX+SII].

 

Смешанная непосредственная адресация ячеек памяти имеет несколько вариантов:

  • непосредственная обычная:

MOV AX, offset pole.

 

Здесь в качестве непосредственного операнда берется смещение адреса переменной pole;

  • непосредственная с индексированием, когда в качестве исполнительного адреса операнда берется сумма значений индексного регистра и непосредственного смещения:

MOV AX, [SI+const],

 

причем смещение, обозначенное const, может быть задано числом, идентификатором константы, смещением адреса переменной (offset), или их комбинацией в виде простого выражения;

  • непосредственная с базированием, в которой, в отличие от предыдущей адресации, фигурирует базовый, а не индексный регистр:

MOV AX, [BX+const].

 

Форма записи смещения относительно базы может быть любой из 3-ех нижеприведенных:

 

MOV AX, [BX]+4 ,

MOV AX, 4[BX] ,

MOV AX, [BX+4].

 

Это примечание относится и к форме записи команд с индексированием (предыдущий вид адресации);

  • непосредственная с базированием и индексированиемотличается тем, что для вычисления исполнительного адреса берется сумма базового и индексного регистра, к которым добавляется непосредственно фигурирующее в команде смещение:

MOV AX, pole[BX+SI+const].

 

Адресация с базированием и индексированием очень полезна при работе с двумерными массивами и таблицами. В ней исполнительный адрес вычисляется как сумма значений базового регистра, индексного регистра и (возможно) сдвига. В случае двумерного массива базовый адрес может содержать начальный адрес массива, а значения сдвига и индексного регистра могут содержать смещения по строке и столбцу. Допустимыми форматами команд являются следующие записи:

 

MOV AX, [BX+2+DI],

MOV AX, [DI+BX+2]

MOV AX, [BX+2][DI]

MOV AX, [BX+2+DI]

MOV AX, [BX][DI+2]

MOV AX, NUMBER [BP][SI].