Схема возможного размещения сегментов в памяти
Процессор может одновременно адресовать 4 различных сегмента памяти, каждый из которых может быть размером до 64 Кбайт. Они могут пересекаться и даже могут быть размещены все в одном участке размером в 64Кбайт. Схематично расположение сегментов представлено на рис.5. адреса
сегментные регистры Рис. 5. Возможное размещение сегментов в памяти При сегментной организации адресуется 2 20 (~ 1 млн. ) байтов. Но для формирования адреса использовались два 16-ти разрядных двоичных числа. С помощью этих чисел можно было бы адресовать на прямую без разбиения на сегменты 2 16 * 2 16 = 2 32 (~ 4 млрд.) байтов. Все возможности не используются из-за допустимости пересечения сегментов. Например, комбинации чисел 0х0000:0х0413, 0х0001:0х0403, 0х0021:0х0203 адресуют один и тот же физический адрес 0х413 (0х00000+0х0413==0х00010+0х0403==0х00210+0х0203==0х00413). Значениями указателей в общем случае (far) является число типа long,старшие байты которого состоят из сегментной части адреса, а младшие – из смещения 0xHHHHHHHH. Указатели в компиляторах TC++ и BC++ делятся на 4 группы, для описания которых, введены модификаторы (служебные слова) позволяющие выбирать внутреннее представление указателей: - near - ближние - far - дальние - huge - нормализованные - _cs, _ds, _es, _ss – сегментные - Ближние указатели имеют длину 2 байта и представляют смещение в конкретном сегменте. Адресуют только 64Кбайта памяти.
Дальние указатели занимают 4 байта, содержат и номер сегмента и смещение. Адресуют только 1Мбайт памяти. Разные сочетания сегментной части и смещения могут адресовать один и тот же физический адрес, один и тот же байт могут адресовать несколько указателей.
Нормализованные указатели имеют длину 4 байта и воспринимаются, как одно 32 разрядное значение, но позволяют однозначно адресовать только 1Мбайт памяти. Любому физическому адресу представляется единственное сочетание сегмента и смещения. Дается номер только того сегмента, для которого смещение не больше 15 (от 0 до 15). Например, для физического адреса 0х413 полный адрес будет 0х0041:0х0003 и соответственно значение нормализованного указателя однозначно равно 0х00410003. Сегментные указатели – это ближние указатели, имеют длину 2 байта и хранят значение смещения в известных сегментах (данных, стеке, и так далее). Для доступа к этим сегментам введены регистровые переменные (_CS, _DS, _ES, _SS), в которых хранится сегментная часть адреса. А сегментные указатели задают смещение в известных сегментах. Например, определим указатель: nt _ss * pss;значение указателя pss позволяет задавать смещение в сегменте стека.
|