TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

Сегмент локальных динамических данных 

             Каждая прикладная  программа  или библиотека имеет один сег-
        мент данных,  который называется сегментом локальных динамических
        данных и может занимать до 64К. На сегмент локальных динамических
        данных  всегда указывает регистр сегмента данных DS.  Он разделен
        на четыре части:

                      Сегмент локальных динамических данных
                      ┌───────────────────────────────────┐
                      │                                   │
                      │ Локальная динамически распределя- │
                      │ емая область памяти               │
                      │                                   │
                      ├───────────────────────────────────┤
                      │                                   │
                      │             Стек                  │
                      │                                   │
                      ├───────────────────────────────────┤
                      │                                   │
                      │       Статические данные          │
                      │                                   │
                      ├───────────────────────────────────┤
                      │                                   │
                      │         Заголовок задачи          │
                      │                                   │
                      └───────────────────────────────────┘

             Рис. 21.7 Сегмент локальных динамических данных.

             Первый 16 байт сегмента локальных динамических данных всегда
        содержат заголовок задачи,  в котором Windows сохраняет различную
        системную информацию.

             Область статических данных содержит все глобальные  перемен-
        ные и типизированные константы,  описанные в прикладной программе
        или библиотеке.

             Сегмент стека используется для хранения  локальных  перемен-
        ных,  распределяемых процедурами и функциями. На входе в приклад-
        ную программу регистр сегмента стека SS и указатель стека SP заг-
        ружаются таким образом,  что SS:SP указывает на первый байт после
        области стека в сегменте локальных динамических данных. При вызо-
        ве  процедур  и функций SP перемещается вниз,  выделяя память для
        параметров,  адреса возврата и локальных переменных.  Когда подп-
        рограмма  возвращает управление,  процесс изменяется на обратный:
        SP увеличивается и принимает то значение,  которое было перед вы-
        зовом. Используемый по умолчанию размер области стека в автомати-
        ческом сегменте данных равен 8К,  но с помощью директивы компиля-
        тора $M это значение можно изменить.

             В отличие  от прикладной программы библиотека в сегменте ло-
        кальных динамических данных не имеет области стека.  При вызове в
        динамически  компонуемой библиотеке DLL процедуры или функции ре-
        гистр DS указывает на сегмент локальных динамических данных  биб-
        лиотеки,  но  пара регистров SS:SP не изменяется.  Таким образом,
        библиотека всегда использует стек вызывающей прикладной  програм-
        мы.

             Последняя часть  в  сегменте локальных динамических данных -
        локальная динамически распределяемая область.  Она  содержит  все
        локальные  динамические данные,  которые распределялись с помощью
        функции LocalAlloc в Windows.  По умолчанию локальная динамически
        распределяемая область имеет размер 8К, но это значение можно из-
        менить с помощью директивы компилятора $M.

             Windows допускает, чтобы сегмент локальных динамических дан-
        ных  был  перемещаемым,  но Borland Pascal этого не поддерживает.
        Сегмент локальных динамических данных  прикладной  программы  или
        библиотеки Borland Pascal всегда блокируется,  этим обеспечивает-
        ся, что селектор (адрес сегмента) сегмента локальных динамических
        данных никогда не изменяется. При работе в стандартном или расши-
        ренном режиме это не приводит ни к  какому  ухудшению,  поскольку
        сегмент сохраняет тот же селектор даже при перемещении в физичес-
        кой памяти.  Однако в реальном режиме,  если требуется расширение
        локальной динамически распределяемой области,  Windows, возможно,
        не сможет этого сделать, поскольку сегмент локальных динамических
        данных перемещаться не может.  Если ваша прикладная программа ис-
        пользует локальную динамически распределяемую  область  памяти  и
        должна выполняться в реальном режиме, то следует обеспечить, что-
        бы начальный размер локальной динамически распределяемой  области
        был таким,  чтобы он удовлетворял всем потребностям в распределе-
        нии локальной динамической области (для этого используется дирек-
        тива компилятора $M).

Содержание

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz