Каждый вид ссылок к памяти связан с соответствующим сегментным регистром. Ссылки к коду, данным и стеку выполняются посредством доступа к содержимому соответствующих сегментных регистров. Во время выполнения программы возможен доступ и к другим сегментам, для чего требуется загрузить селекторы нужных сегментов в сегментные регистры.
Каждый сегментный регистр имеет "видимую" и "невидимую" часть, как показано на Рисунке 5-6. Для загрузки видимой части сегментных регистров используются разновидности команды MOV, невидимая часть загружается самим процессором.
Видимая часть Невидимая часть ------------------------------------------------ | Селектор | Базовый адрес, граница и т.д. | CS |----------------------------------------------| | | SS |----------------------------------------------| | | DS |----------------------------------------------| | | ES |----------------------------------------------| | | FS |----------------------------------------------| | | GS ------------------------------------------------ Рисунок 5-6. Сегментные регистры Для загрузки этих регистров используются команды прикладных программ, описанные в Главе 3. Имеется два типа таких команд:
- Команды прямой загрузки, такие как MOV, POP, LDS, LSS, LSG и LFS. Эти команды обращаются к сегментным регистрам явно.
- Неявные команды загрузки, такие как версии команд CALL и JMP для дальних указателей. Эти команды изменяют содержимое регистра CS в процессе их выполнения.
При использовании этих команд, в видимую часть сегментного регистра загружаются селектор сегмента. Базовый адрес, границу, тип и прочую информацию процессор извлекает из дескрипторной таблицы автоматически и помещает их в невидимую часть сегментного регистра.
Поскольку большинство команд ссылается на сегменты, селекторы которых уже загружены в сегментные регистры, процессор может прибавлять смещения логического адреса к базовому адресу сегмента без потерь быстродействия.