При трансляции программы ассемблер заменит символическое имя смещением поля данных относительно начала сегмента, т.е. определит непосредственное смещение и поместит его в команду, например
inc word prt 28h ;увеличить на 1 слово cо смещением 28h
Примечание – В этом случае адресация данных выполняется по схеме:
EBР + <смещение, заданное в команде>,
но содержимое регистра EВР в вычислении исполнительного адреса не участвует, поскольку это частный случай команды, использующийся для явной адресации.
Размер операнда – слово, определяется директивой определения поля DW.
В отличие от прямого косвенный адрес определяет не смещение данных в основной памяти, а местоположение компонентов адреса этих данных. В этом случае в команде указываются один или два регистра в соответствии с допустимыми схемами адресации (см. ниже) и непосредственное смещение, которое может задаваться числом или символическим именем.
Адрес операнда (исполнительный) считается по формуле:
EA = (База) + (Индекс)*Масштаб + Непосредственное смещение
База Индекс Масштаб Смещение
é EAX ù
CS: ê EBX EAX ú
SS: ê ECX EBX 1 отсутств., ú
DS: ê EDX + ECX * 2 + 8 или ú
ES: ê EBP EDX 4 32бита ú
FS: ê ESP EBP 8 ú
GS: ê ESI ESI ú
ë EDI EDI û
Примеры:
inc word ptr[500]; непосредственный адрес
mov ES:[ECX],EDX; задана только база
mov EAX, TABLE[ESI*4] ; заданы индекс и масштаб
Косвенный адрес заключается в квадратные скобки весь или частично, например:
[OPND +ESI] OPND [ESI] OPND + [ESI] [OPND] +[ESI]
Приведенные выше формы записи косвенного адреса интерпретируются одинаково.
При трансляции программы ассемблер определяет используемую схему адресации и соответствующим образом формирует машинную команду. При этом символическое имя заменяется непосредственным смещением относительно начала сегмента так же, как в случае прямой адресации.
Примеры: [a + EBX] и [EBP +ESI +6].
В первом случае исполнительный адрес операнда определяется суммой содержимого регистра EBX и непосредственного смещения, заданного символическим именем «а», а во втором – суммой содержимого регистров EBP, ESI и непосредственного смещения, равного 6.
Примечание. При использовании косвенной адресации по схеме EВР + <смещение, заданное в команде> смещение не может быть опущено, так как частный случай адресации по данной схеме с нулевой длиной смещения используется для организации прямой адресации (см. предыдущую страницу). Следовательно, при отсутствии смещения в команде следует указывать нулевое смещение, т.е. [EВР +0] .
Длина операнда может определяться:
а) кодом команды – в том случае, если используемая команда обрабатывает данные определенной длины, что специально оговаривается;
б) объемом регистров, используемых для хранения операндов (1, 2 или 4 байта);
в) специальными указателями byte ptr(1 байт), word ptr(2 байта) иdword ptr(4 байта), которые используются в тех случаях, если ни один операнд не находится в регистре и размер операнда отличен от размера, определенного директивой объявления данных. Например:
mov byte ptr x, 255 ;нас интересует только первый байт слова