РАЗМЕЩЕНИЕ ДАННЫХ В ПАМЯТИ

 

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

Статическая память - данные размещаются в ней после компиляции и хранятся до конца. В стеке - временно.

Размещением данных управляет программист. Адрес любого участка памяти состоит из смещения и сегмента. Это 16-ти разрядные числа.

Полный адрес получается : сегмент * 16 + смещение.

Существует 4 специальных регистра для хранения адресов сегмента CS, DS, SS, ES. Для оптимизации управления памятью имеется 6 моделей памяти.

Динамическая память "куча" используется в зависимости от выбранной модели памяти. Различают "ближнюю кучу" - неиспользованную часть сегмента стека и "дальнюю кучу" - оставшаяся свободная память машины. В начале блока выделяемой памяти записывается его размер. Он затем используется при удалении.

 

 

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

 

C++ поддерживает 6 моделей памяти: tiny, small, medium, compact, large, huge. Для каждой модели различается количество сегментов отведенных под код программы и данных. Рассмотрим эти модели.

1. Крошечная модель tiny

CS,DS,SS

 

 


SP

 

 

2. Малая модель small

CS

 

DS,SS

 

 

SP

 

 

3. Средняя модель medium


CS

 

DS,SS

 

SP

 

 

4. Компактная модель Compact

 

CS

 

DS

 

SS

 

SP

 

5.Большая модель large


 

CS

 

 

DS

 

SS

 

 

SP

 

6. Гигантская модель huge

 


CS

 

DS

 

SS

 

 

SP

 

Организация процессора 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 - удалить модуль

 








Дата добавления: 2016-02-02; просмотров: 1067;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.