Каждая прикладная программа или библиотека имеет один сег-
мент данных, который называется сегментом локальных динамических
данных и может занимать до 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).