Микропроцессор 8086 для формирования 20-разряного физического адреса использует 16-разрядные селекторы сегментов и смещения.
Селекторы сегментов хранятся в сегментных регистрах (см. подраздел 2.3.2 “Сегментные регистры”). В зависимости от того, с какой целью выполняется обращение к памяти, процессор использует один из четырёх имеющихся селекторов сегментов. Так, если обращение производится для выборки кода команды, используется селектор сегмента кода, хранящийся в регистре CS, а если происходит запись данных в стек – селектор сегмента стека из регистра SS.
Смещение формируется в процессе выполнения команды и определяет местоположение требуемой информации внутри сегмента. Например, при выборке кода команды производится чтение байта памяти, хранящегося по смещению из регистра IP (см. подраздел 2.3.4 “Указатель инструкции”) в сегменте кода, селектор которого находится в регистре CS. Поскольку смещение является 16-разрядным, размер сегмента ограничен 64 Кбайтами.
Физический адрес вычисляется путём сложения 16-разрядного смещения с селектором соответствующего сегмента, сдвинутым влево на четыре разряда. Так как селектор сегмента является 16-разрядной величиной, сдвиг преобразует его в 20-разрядное число, младшие четыре разряда которого содержат нули. Схематически это можно представить следующим образом:
-----T----T----T----¬
¦ с м е щ е н и е ¦
L----+----+----+-----
+
-----T----T----T----T----¬
¦ с е л е к т о р ¦0000¦
L----+----+----+----+-----
--------------------------
-----T----T----T----T----¬
¦ физический адрес ¦
L----+----+----+----+-----
Перенос, который может возникнуть из старшего (19-го) разряда физического адреса в процессе сложения, игнорируется[1]. Таким образом, при доступе к слову памяти, расположенному по смещению 000F16 в сегменте с селектором FFFF16, физический адрес младшего байта этого слова будет равен FFFFF16, а старшего – 0000016.
Легко заметить, что для доступа к одной и той же физической ячейке памяти могут использоваться различные комбинации селекторов и смещений.