Прямая адресация

Прямая адресация – это простейший вид адресации операнда в памяти, так как эффективный адрес содержится в самой команде и для его формирования не используется никаких дополнительных источников или регистров. Эффективный адрес берется непосредственно из поля смещения машинной команды, которое может иметь размер 8, 16, 32 бита. Это значение однозначно определяет байт, слово или двойное слово в сегменте данных.

Прямая адресация может быть двух типов.

· Относительная прямая адресация используется в командах условных переходов для указания относительного адреса перехода. Относительность такого перехода заключается в том, что в поле смещения машинной команды содержится 8-, 16- или 32-разрядное значение, которое в результате работы команды будет складываться с содержимым регистра указателя команд IP/EIP. В результате такого сложения получается адрес, по которому и осуществляется переход. К примеру,

jc ml ;переход на метку ml, если флаг cf = 1

mov al,2

ml :

Хотя в команде указана конкретная метка, ассемблер вычисляет смещение этой метки относительно следующей команды (в нашем случае mov al,2) и подставляет его в формируемую машинную команду JC.

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

mov ax,word ptr [0000] ;записать слово по адресу ds:0000 в регистр ах

Однако такая адресация применяется редко – обычно ячейкам в программе присваиваются символические имена. В процессе трансляции ассемблер вычисляет и подставляет значения смещений этих имен в поле смещения формируемой им машинной команды. В итоге получается, что машинная команда прямо адресует свой операнд, имея, фактически, в одном из своих полей значение эффективного адреса. К примеру,

data segment

perl dw 5

data ends

code segment

mov ax,data

mov ds.ax

mov ax,perl ;записать слово perl (его физический адрес ds:0000) в ах

Мы получим тот же результат, что и при использовании команды mov ax,word ptr [0000].