Сегментные регистры и трансляция сегментов

При использовании сегментированной математической памяти необходима процедура преобразования адреса сегментированной (математической памяти) в адреса линейной физической памяти при каждом обращении к памяти.

Адрес объекта в сегментированной памяти задается двумя компонентами базовым адресом сегмента и смещением в сегменте. В команде задается только смещение в сегменте. Базовый адрес сегмента задается содержимым одного из четырех сегментных регистров (рис. 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, добавлением четырех нулей после младшего разряда


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: