Механизм формирования физического адреса

Каждая программа в общем случае может состоять из любого количества сегментов, но непосредственный доступ она имеет только к трем основным: кода, данных и стека, – и от одного до трех дополнительных сегментов данных. Программа никогда не знает, по каким физическим адресам будут размещены ее сегменты. Этим занимается операционная система, которая размещает сегменты программы в оперативной памяти по определенным физическим адресам, после чего помещает значения этих адресов в соответствующие сегментные регистры. Внутри сегмента программа обращается к адресам относительно начала сегмента линейно, то есть начиная с 0 и заканчивая адресом, равным размеру сегмента. Этот относительный адрес, или смещение, который микропроцессор использует для доступа к данным внутри сегмента, называется эффективным.

Под физическим (линейным или полным) адресом понимается адрес памяти, выдаваемый на шину адреса микропроцессора.

В реальном режиме механизм адресации физической памяти имеет следующие характеристики:

ü диапазон изменения физического адреса от 0 до 1 Мбайт. Эта величина определяется тем, что шина адреса Intel 8086 имела 20 линий;

ü максимальный размер сегмента 64 Кбайт. Это объясняется 16-разрядной архитектурой Intel 8086. Нетрудно подсчитать, что максимальное значение, которое могут содержать 16-разрядные регистры, составляет 216 - 1, что применительно к памяти и определяет величину 64 Кбайт;

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

Сегментная составляющая адреса (или база сегмента) представляет собой 16-битное значение, помещенное в один из сегментных регистров. Максимальное значение, которое при этом получается, соответствует 216 - 1. Таким образом получается, что адрес начала сегмента может быть только в диапазоне 0-64 Кбайт от начала оперативной памяти. На рис. 3.1. показано как происходит адресация остальной части оперативной памяти вплоть до 1 Мбайт. Сегментная часть извлекается из одного из сегментных регистров и сдвигается на четыре разряда влево. Получившееся 20-битное значение и является настоящим физическим адресом, соответствующим началу сегмента. Так как последние четыре разряда адреса сегмента всегда нули, данный адрес может указывать только на каждый 16-ый байт памяти. Поэтому память разбивается на 16-битовые блоки, называемые параграфами, а адрес сегмента счита

 
 

ется адресом некоторого параграфа.

Вторая компонента, участвующая в образовании физического адреса некоторого объекта в памяти, смещения представляет собой 16-битное значение. Значение смещения можно получить минимум из одного и максимум из трех источников: из значения смещения в самой машинной команде и (или) из содержимого одного базового и (или) одного индексного регистра. Количество источников, участвующих в формировании смещения, определяется кодированием конкретной машинной команды, и если таких источников несколько, то значения в них складываются. Например, если регистр сегмента данных содержит число 1234h, а базовый регистр BX – ABCDh, то получаем следующее значение физического адреса: 12340h + ABCDh = 1CF1Dh

В микропроцессоре эти операции выполняются аппаратно. Данный механизм образования физического адреса позволяет сделать программное обеспечение перемещаемым, то есть не зависящим от конкретных адресов загрузки его в оперативной памяти.

Замечание. С сегментацией связаны понятия ближнего и дальнего адреса. При ближнем (Near), или внутрисегментном, обращении доступ к требуемой памяти осуществляется только указанием смещения, а адрес сегмента определяется текущим содержимым соответствующего регистра сегмента. При дальнем (Far), или межсегментном, обращении указывается полный адрес, содержащий 16-битное значение смещения (загружаемое в соответствующий сегментный регистр) и 16-битное смещение. Из-за пересылки большого количества байт адреса дальние обращения выполняются медленнее.