Прямая адресация
Прямая адресация — это простейший вид адресации операнда в памяти, так как эффективныйадрес содержится в самой команде и для его формирования не используется никаких дополнительных источников или регистров. Эффективный адрес берется непосредственно из поля смешения машиннойкоманды (см. главу 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.
Косвенная адресация имеет следующие разновидности:
□ косвенная базовая, или регистровая, адресация;
□ косвенная базовая адресация со смещением;
□ косвенная индексная адресация со смещением;
□ Косвенная базовая индексная адресация;
□ косвенная базовая индексная адресация со смещением.