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

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

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

К примеру,

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

………..

m1:

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

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

К примеру,

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

;ds:0000 в регистр ах

 

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

К примеру,

data segment

per1 dw 5

…………..

data ends

code segment

mov ax, data

mov ds.ax

…………….

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

 

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

 

Остальные виды адресации относятся к косвенным. Слово «косвенный» в названииэтих видов адресации означает, что в самой команде может находиться лишь часть аффективного адреса, а остальные его компоненты находятся в регистрах, на вторые указывают своим содержимым байт mod r/m и, возможно, байт sib.

Косвенная адресация имеет следующие разновидности:

□ косвенная базовая, или регистровая, адресация;

□ косвенная базовая адресация со смещением;

□ косвенная индексная адресация со смещением;

□ Косвенная базовая индексная адресация;

□ косвенная базовая индексная адресация со смещением.