модели памяти

advertisement
1. Крошечная модель Tiny - 64 Кбайта код программы и данные
CS,DS,SS
Сегмент кода
Сегмент стат. данных
Куча
Свободная динамич.
память
SP
64 Кбайта
Сегмент стека
2. Малая модель Small – 64Кбайта код программы и 64 Кбайта данные
CS
DS,SS
Сегмент кода
64 Кбайта
Сегмент стат. данных
«Ближняя» куча
Свободная динамич.
память
64 Кбайта
Сегмент стека
SP
«Дальняя» куча
Свободная
динамическая память
3. Средняя модель Medium – 1 Мбайт код программы и 64 Кбайта данные
CS
DS,SS
Сегмент кода А
64 Кбайта
Сегмент кода В
64 Кбайта
Сегмент кода С
64 Кбайта
Сегмент стат. данных
Куча
Свободная динамич.
память
SP
64 Кбайта
Сегмент стека
«Дальняя» куча
Свободная
динамическая память
4. Компактная модель Compact - 64Кбайта код программы и 1 Мбайт данные
CS
Сегмент кода
Сегмент стат. данных
Свободная динамич.
память
64 Кбайта
64 Кбайта
64 Кбайта
DS
SS
SP
5.Большая модель Large – 1 Мбайт код программы и 1 Мбайт данные
CS
DS
SS
SP
Сегмент кода А
64 Кбайта
Сегмент кода В
64 Кбайта
Сегмент кода С
64 Кбайта
Сегмент стат. данных
64 Кбайта
Свободная динамич.
память
64 Кбайта
Сегмент стека
Куча
6. Гигантская модель Huge - 1 Мбайт код программы и 1 Мбайт данные
CS
DS
Сегмент кода А
64 Кбайта
Сегмент кода В
64 Кбайта
Сегмент кода С
64 Кбайта
Сегмент стат. данных
Сегмент стат. данных
SS
SP
Сегмент стат. данных
Свободная динамич.
память
64 Кбайта
64 Кбайта
64 Кбайта
64 Кбайта
Сегмент стека
Куча
Свободная
динамическая память
7.Плоская модель Flat.
Модель Flat соответствует варианту модели Small, но используется 32 разрядные
смещения (суммарная длина адреса 6 байт). Эта модель используется только для МП 386 и
выше. В этом случае с помощью одного регистра обеспечивается доступ ко всей
физической памяти. Хотя регистры DS, SS, ES отличаются, они фактически указывают на
один физический адрес начала сегмента (дескрипторы имеют одинаковый адрес и длину
сегмента, но разные права доступа к элементам памяти внутри сегмента). Эта модель
используется для программ для Windows.
Организация процессора 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 сегмента.
int far array [30000];
char far a [70000]; - ошибка более 64кб.
char huge b[70000]; - верно.
Распределение данных по сегментам и управление перехода от сегмента к
сегменту берет на себя компилятор. Для каждого модуля можно выделить более одного
сегмента статических данных и кода.
Для "малых" моделей все указатели типа near, для больших - far. Указатели на
функции для моделей tiny, small,compact - near, в остальных - far. Если все функции в
одном файле, то все указатели типа 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 - удалить модуль
Download