Сегментные регистры используются при формировании линейных адресов памяти. Вторым компонентом для формирования линейного адреса является смещение, называемое также эффективным адресом (применительно к архитектуре IA-32 эти называния равноправны, хотя первое применяется намного чаще). Способ вычисления линейного адреса зависит от режима работы процессора и подробно описан в разделе Формирование линейного адреса.
В микропроцессоре 8086 было четыре 16-разрядных сегментных регистра:
- CS — сегментный регистр кода;
- DS — сегментный регистр данных;
- ES — сегментный регистр дополнительных данных;
- SS — сегментный регистр стека.
Начиная с микропроцессора 80386, сегментных регистров стало шесть, но их разрядность не изменилась. «Новичками» стали два сегментных регистра дополнительных данных — FS и GS.
Общие правила использования сегментных регистров процессором таковы:
- для выборки кода команды всегда используется сегментный регистр CS;
- при обращении к стеку (смещение формируется с использованием регистров SP/ESP/RSP или BP/EBP/RBP) всегда используется сегментный регистр SS;
- в строковых операциях при обращении к операнду-приёмнику (смещение в регистре DI/EDI/RDI) применяется сегментный регистр ES;
- во всех остальных случаях, если не используется префикс замены сегмента, доступ к памяти осуществляется с использованием сегментного регистра DS. При наличии префикса замены сегмента вместо DS используется указанный префиксом сегментный регистр.
В реальном режиме содержимое каждого сегментного регистра представляет собой номер параграфа — 16-байтового участка памяти, выровненного на границу 16 байт.
В защищённом режиме каждый сегментный регистр делится на три части, как показано на рисунке:
Бит TI в этом случае указывает, какая таблица дескрипторов должна использоваться: нуль соответствует таблице глобальных дескрипторов (GDT), единица — таблице локальных дескрипторов (LDT). Поле Index является номером (индексом) дескриптора в таблице дескрипторов; этот дескриптор используется при вычислении линейного адреса. Наконец, поле RPL является запрошенным уровнем привилегий, используемым для контроля прав доступа программы к сегменту (подробнее об этом говорится в разделе Защита на уровне сегментов). Частным случаем RPL является текущий уровень привилегий — CPL, чьё значение в любой момент времени находится в сегментном регистре CS.
В 64-разрядном режиме сегментные регистры CS, DS, ES и SS в формировании линейного адреса не участвуют, поскольку сегментация в этом режиме не поддерживаются. Сегментные регистры FS и GS могут использоваться в качестве дополнительных регистров базы, о чём подробнее говорится в разделе Эффективный адрес.