Архитектура микропроцессора предусматривает разбиение оперативной памяти на физические сегменты. Размер каждого сегмента равен 64 Кбайт (К=1024). Вычисление физического адреса осуществляется путем сложения 16 - разрядного адреса сегмента, сдвинутого на 4 разряда, с адресом смещения в соответствии со следующей схемой:
15 0
. . . . . . . . Базовый
сегмент
15 0
Смещение . . . . . . . . . . . . . . .
19 0
20 – разрядный физический адрес
Адрес сегмента адресует память с «точностью» до 16 байт (или с точностью до параграфа); смещение адресует память с точностью до байта в пределах 64 Кбайт, размещение в памяти которых определяется начальным адресом сегмента.
Распределение памяти для программы на языке Си осуществляется следующим образом:
1. По умолчанию программе выделяется суммарный объем памяти, равный 128 Кбайт.
- 64 Кбайт для кода программы;
- 64 Кбайт для статистических данных и стека.
Такая модель памяти называется малой (small). В малой модели для доступа к объектам программы (коду или данным) используются указатели типа near – ближние указатели.
2. Если размер кода программы превышает 64 Кбайта, а для размещения стека и данных достаточно 64 Кбайта, то применяется средняя модель памяти (medium) . В такой модели для функций используются дальние указатели far, а для данных near.
3. Если размер программного кода не велик, а данные требуют больше, чем 64 Кбайт, то используется компактная (compact) модель памяти.
В такой модели доступ к объектам программы осуществляется с помощью указателей типа far, а в максимальной модели с помощью указателей типа huge.
4. Если как для данных, так и для кода требуется больше одного сегмента (>64 Кбайт), то применяется либо большая (large) модель, либо огромная(huge) модель.
Разница между указателями far и huge заключается в том, что в адресной арифметике при вычислении far указателей на данные используется 16- битное смещение. Это ограничивает размер отдельного элемента данных значением 64 Кбайт. Указанное ограничение снято в огромной модели памяти. Адреса huge позволяют использовать массивы, размер которых превышает 64 Кбайт. В адресной арифметике используются все 32 разряда, а тип результата unsigned long.
Работая в любой модели памяти, программист имеет возможность ее модификации, применяя явно модификаторы near, far и huge.
Так, например, если за модификатором near, far или huge следует идентификатор, то соответствующий программный объект будет размещен либо в стандартном сегменте (для near), либо в другом сегменте (для far и huge).