Сегментные регистры и трансляция сегментов.
При использовании сегментированной математической памяти необходима процедура преобразования адреса сегментированной (математической памяти) в адреса линейной физической памяти при каждом обращении к памяти.
Адрес объекта в сегментированной памяти задается двумя компонентами базовым адресом сегмента и смещением в сегменте. В команде задается только смещение в сегменте. Базовый адрес сегмента задается содержимым одного из четырех сегментных регистров (рис. 2.3).
МП IA-16 содержали 4 сегментных регистров по 16 бит:
· ES – дополнительного сегмента данных,
· CS – сегмента кода,
· SS – сегмента стека,
· DS – сегмента данных,
№ | Базовые адреса сегментов | |||||
ES – Доп. сегмент данных | ||||||
CS – Сегмент кода | ||||||
SS – Сегмент стека | ||||||
DS – Сегмент данных | ||||||
Рис.2.3. Сегментные регистры IA-16. |
Использование регистров CS, SS, DS и ES возможно по умолчанию и с использованием префикса замены сегмента. Базовые адреса сегментов используются для преобразования адреса сегментированной памяти в линейную.
Емкость физической памяти в МП IA-16 позволяет разместить одновременно до 16 полных сегмента по 64 Кбайт (216 байт). Но одновременно, без изменения содержимого сегментных регистров, в реальном режиме IA-16 можно обращаться только к четырем, по числу сегментных регистров.
Переход на использование остальных сегментов (кроме кодовых), размещенных в оперативной памяти можно производить:
· при помощи загрузкой базовых адресов в соответствующие сегментные регистры командами пересылки (mov ),
· командами загрузки сегментных регистров (LES, LDS и LSS).
Все операции работы со стеком ориентированы на словарную организацию стека. По этой причине адрес указателя стека и базовый адрес сегментного регистра SSдолжны бить четными.
Переходы на новые кодовые сегменты производятся командами межсегментных передач управления.
Преобразование адреса сегментированной памяти в адрес линейной (плоской) памяти производится процедурой трансляции сегмента: сложением базового адреса сегмента с адресом операнда в сегменте.
Но сегментные регистры - 16-и битные, а базовые адреса должны быть 20 - битными. Поэтому при использовании сегментных регистров их содержимое умножается на 16, добавлением четырех нулей после младшего разряда