Команды с явными
операндами в памяти должны содержать указание на сегмент, содержащий операнд и смещение
операнда относительно начала сегмента. Сегменты указываются при помощи префикса
замены сегмента (байта, который помещается перед командой). Если сегмент не
указывается явно, он выбирается автоматически согласно простому правилу.
Смещение операнда в сегменте указывается одним из следующих способов:
1. Большинство
команд, которые обращаются к памяти, содержат байт для указания метода
адресации операнда. Байт, который называется modR/M, помещается после кода
операции и указывает, где располагается операнд: в памяти или в регистре. Если
операнд находится в памяти, его адрес получается исходя из содержимого
сегментного регистра и следующих величин: регистра базы, регистра индекса,
масштабирования и смещения. При использовании индексного регистра, байт modR/M
следует за байтом, кодирующим индексный регистр и масштабирование. Такой способ
адресации является наиболее гибким.
2. Некоторые
команды используют неявные режимы адресации:
Команда MOV,
использующая в качестве операнда-источника или операнда назначения регистр AL
или EAX, может использовать для адресации памяти двойное слово, закодированное
в команде. Эта специальная форма команды MOV не позволяет использовать регистр
базы, индексный регистр и масштабирование. Такая форма команды на один байт короче,
чем при использовании других регистров общего назначения.
Операции
обработки строк используют для адресации памяти сегментный регистр DS и регистр
ESI (команды MOVS, CMPS, OUTS, LODS и SCAS) или сегментный регистр ES и регистр
EDI (команды MOVS, CMPS, INS и STOS).
Операции работы
со стеком используют для адресации памяти сегментный регистр SS и регистр ESP
(команды, прерывания и исключения PUSH, POP, PUSHA, PUSHAD, POPA, POPAD, PUSHF,
PUSHFD, POPF, POPFD, CALL, RET, IRET и IRETD).