МОДЕЛИ ПАМЯТИ


C++ поддерживает 6 моделей памяти: tiny, small, medium, compact, large, huge. Для каждой модели различается количество сегментов отведенных под код программы и данных. Рассмотрим эти модели.
1. Крошечная модель tiny
2.Малая модель small
3.Средняя модель medium
4.Компактная модель Compact
5. Большая модель large
6.Гигантская модель huge
Организация процессора I8086 накладывает ограничения на размер статистической памяти программы — размер кодов функций и размер статических данных. Размер данных не более 64 Кб в одном сегменте, т.к. размер адресуемой памяти ПЭВМ равен 1 Мб.
Существует 2 варианта построения программы:
А) весь исходный текст компилируется сразу;
Б) программа собирается из нескольких фрагментов (модулей), которые компилируются отдельно. В любом таком модуле свои сегмент данных и сегмент кода. Объединение сегментов может происходить по-разному – в зависимости от используемого метода настройки сегментных регистров CS и DS. Может быть так, что независимо от количества модулей настройка CS,DS выполняется только однажды — тогда размер кода < 64 Кбайт.
Размер кода или данных ограничен адресной памятью (1 Мбайт).
tiny 64 Кб всего
small 64 Кб кода и 64 Кб данные
medium 1Мб код, 64 Кб данные
compact 64 Кб код, 1Мб данные
large 1Мб код, 1Мб данные
huge тоже что large, но размер статических данных может превышать 64 Кб.
В huge для статистических данных выделяют более 1 сегмента.
Распределение данных по сегментам и управление перехода от
сегмента к сегменту берет на себя компилятор. Для каждого модуля можно выделить более одного сегмента статических данных.
ES — дополнительный сегмент регистр в любой модели памяти.
int far array [30000];
char far a [70000]; — ошибка более 64кб.
char huge b[70000]; -верно.
Для «малых» моделей все указатели типа near, для больших — far. Для указателей на функции near для tiny, small,compact, far в остальных. DS для near указывает на данные, CS -для near указывает на функции.
Размер кода тоже не может превышать 64кб. Для любого модуля заво-дится свой сегмент кода. Общий размер памяти выделяется для хранения кода не более 1 Мб для medium, large, huge.
Если все функции в одном файле, то все указатели типа near. Если несколько модулей, но они не обращаются друг к другу, тоже самое. Но если есть обращения функций одного модуля к функциям другого, они должны быть описаны как far функции.
void near fn (int arg);
fn (1);
SP: смещение адреса
SP + 2: arg.

void far ff(int arg);
ff(2);
SP: смещение адреса
SP + 2: сегмент
SP + 4: arg.

huge fn — настройка регистра DS на сегмент статических данных того модуля, которому принадлежит функция. Для far функции значения DS меняется.
Для совместной компляции нескольких модулей создается файл-проект. Проект создается через пункт меню Project — проект, где указываются все компилируемые файлы. Для этого используется подпункт меню:
Open Project ? Insert — добавить модуль
Delete — удалить модуль

СПИСОК ЛИТЕРАТУРЫ

1. М. Уэйт, С. Прайт, Д. Мартин. Язык СИ. — М.: «Мир», 1988 г.
2. Кеpниган Б., Ритчи Д. Язык пpогpаммиpования Си. — М.: Финансы и статистика, 1992г.
3. Кузнецов С.Д. Турбо Си. — М.: Малип, 1992г.
4. П. Киммел Borland C++ 5.0. – C-П.: «BHV-Cанкт Питербург», 1997 год.
5. Цимбал А.А.,Майоров А.Г., Козодаев М.А. Turbo C++: язык и его применение. – М.: «Джен

Загрузка...