Все методы адресации в различных процессорах сводятся к нескольким основным. Во-первых, операнд может быть указан в команде, и это называют непосредственной адресацией.
Рисунок 2. Непосредственная адресация.
Если в команде указывают адрес операнда, находящегося в памяти, то имеет место прямая адресация. Таким же способом для процессора Intel может быть указан операнд, находящийся в порте ввода/вывода, правда, порт может быть указан только от 0-го до 255-го.
Рисунок 3. Прямая адресация.
Особым случаем прямой адресации является регистровая адресация, когда операнд находится в одном из регистров процессора, а в команде указан этот регистр.
Рисунок 4. Регистровая адресация.
Если же в команде указан адрес адреса операнда (в адресном пространстве памяти или ввода/вывода), то это один из вариантов косвенной адресации. Обычно хранилищем адреса операнда является опять же один из процессорных регистров, который также указывается в команде, как и при регистровой адресации.
Рисунок 5. Косвенная адресация.
Косвенная адресация допускает следующие варианты (у Intel это многообразие возможно лишь для адресации памяти):
- собственно косвенная адресация в чистом виде, называемая Intel либо индексной, либо базовой, в зависимости от того, какой регистр используется в качестве указателя адреса;
- косвенная адресация со смещением, когда к содержимому регистра прибавляется указанное в команде смещение (у Intel, соответственно, индексная со смещением либо базовая со смещением);
- косвенная адресация со смещением из регистра, когда адрес операнда определяется как сумма содержимого двух регистров смещение (у Intel это называется базовая индексная адресация);
- косвенная адресация со смещением из регистра и из команды, в этом случае складывается содержимое двух регистров и к полученной сумме прибавляется смещение, опять же указанное в команде, Intel называет этот метод адресации как базовая индексная адресация со смещением;
- косвенная адресация с автоинкрементом/автодекрементом указателя, т.е. модификацией содержимого регистра до или после использования его в качестве адреса операнда, Intel называет это цепочечными (строковыми) командами. Строковые команды будут рассмотрены в отдельной лабораторной работе. Особым случаем этого способа адресации являются операции со стеком, но здесь Intel не рискнула придумать особое название для адресации стека.
Адресация во всех методах дает адрес в сегменте данных (регистр DS), за исключением адресации через регистр BP, который указывает на смещение в сегменте стека (SS). Кроме того, в строковых операциях индексный регистр источника SI указывает на смещение в сегменте DS, а индексный регистр приемника DI указывает на смещение в сегменте ES, таким образом, строковые операнды (цепочки) адресуются парами DS:SI и ES:DI.
В любой команде, адресующей операнды в памяти, приведенную выше «привязку» к сегментам, принятую по умолчанию, можно изменить, применив перед командой префикс замены сегмента (префикс сегментного регистра).
Следует иметь в виду также тот факт, что в командах процессора Intel во многих случаях используется неявное указание операндов (скрытое в коде операции), как в памяти, так и в регистрах. Например, многие арифметические команды используют неявно аккумулятор, команды цикла – «регистр-счетчик» CX, команда 16-битного умножения помещает результат в пару регистров DX, AX и т.д.