Каждая прикладная программа или библиотека имеет один сег- мент данных, который называется сегментом локальных динамических данных и может занимать до 64К. На сегмент локальных динамических данных всегда указывает регистр сегмента данных DS. Он разделен на четыре части:
Сегмент локальных динамических данных ------------------------------------ ¦ ¦ ¦ Локальная динамически распределя- ¦ ¦ емая область памяти ¦ ¦ ¦ +-----------------------------------+ ¦ ¦ ¦ Стек ¦ ¦ ¦ +-----------------------------------+ ¦ ¦ ¦ Статические данные ¦ ¦ ¦ +-----------------------------------+ ¦ ¦ ¦ Заголовок задачи ¦ ¦ ¦ L------------------------------------
Рис. 21.7 Сегмент локальных динамических данных.
Первый 16 байт сегмента локальных динамических данных всегда содержат заголовок задачи, в котором Windows сохраняет различную системную информацию.
Область статических данных содержит все глобальные перемен- ные и типизированные константы, описанные в прикладной программе или библиотеке.
Сегмент стека используется для хранения локальных перемен- ных, распределяемых процедурами и функциями. На входе в приклад- ную программу регистр сегмента стека SS и указатель стека SP заг- ружаются таким образом, что SS:SP указывает на первый байт после области стека в сегменте локальных динамических данных. При вызо- ве процедур и функций SP перемещается вниз, выделяя память для параметров, адреса возврата и локальных переменных. Когда подп- рограмма возвращает управление, процесс изменяется на обратный: SP увеличивается и принимает то значение, которое было перед вы- зовом. Используемый по умолчанию размер области стека в автомати- ческом сегменте данных равен 8К, но с помощью директивы компиля- тора $M это значение можно изменить.
В отличие от прикладной программы библиотека в сегменте ло- кальных динамических данных не имеет области стека. При вызове в динамически компонуемой библиотеке DLL процедуры или функции ре- гистр DS указывает на сегмент локальных динамических данных биб- лиотеки, но пара регистров SS:SP не изменяется. Таким образом, библиотека всегда использует стек вызывающей прикладной програм- мы.