Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Оверлеи в файлах .Exe

Borland Pascal также позволяет вам записывать оверлеи в ко-

нец выполняемого файла .EXE прикладной программы, а не в отдель-

ный файл .OVR. Чтобы присоединить файл .OVR к концу файла .EXE,

используйте команду DOS COPY с параметром командной строки /B,

например:

COPY/B MYPROG.EXE + MYPROG.OVR

Вы должны убедиться, что файл .EXE компилировался без вклю-

чения в него информации для отладки. Таким образом, в интегриро-

ванной интерактивной среде IDE в меню Options¦Compiler (Парамет-

ры¦Компилятор) проверьте параметр Standalone (Автономная отлад-

ка). При использовании компилятора, работающего с командной стро-

кой, укажите параметр /V.

Для чтения оверлея не из отдельного файла .OVR, а из конца

файла .EXE просто задайте при вызове OvrInit имя файла .EXE. Если

вы работаете под управлением DOS версии 3.х, то можете использо-

вать для получения имени файла .EXE стандартную функцию ParamStr,

например:

OvrInit(ParamStr(0));

Часть III. В среде Borland Pascal Глава 21. Использование памяти

В данной главе описывается, как программы Borland Pascal ис-

пользуют память. Borland Pascal может создавать прикладные прог-

раммы для реального режима DOS, защищенного режима DOS, и

Windows; в каждом типе прикладной программы память используется

по-разному. В данной главе поясняется, как использует память каж-

дый из этих типов программ. Мы рассмотрим также внутренние форма-

ты данных, подсистему управления динамически распределяемой об-

ластью памяти и прямой доступ к памяти.

Использование памяти программами реального режима dos

На Рис. 21.1 приведена схема распределения памяти программы

Borland Pascal, для реального режима DOS.

Префикс программного сегмента (PSP) - это область длиной 256

байт, которая строится операционной системой DOS при загрузке

файла .EXE. Адрес PSP сохраняется в предописанной переменной

Borland Pascal длиной в слово с именем PrefixSeg.

Каждой программе (которая включает в себя основную программу

и каждый модуль) соответствует сегмент ее кода. Основная програм-

ма занимает первый сегмент кода. Следующие сегменты кода заняты

модулями (в порядке, обратном тому, в котором они указаны в опе-

раторе uses). Последний сегмент кода занят библиотекой исполняю-

щей системы (модуль System). Размер отдельного сегмента не может

превышать 64К, однако общий размер кода ограничен только объемом

имеющейся памяти.

Верхняя граница памяти DOS

HeapEnd -->-----------------------------

¦ ¦

¦ свободная память ¦

¦ ¦

HeapPtr -->¦............................¦

¦ динамически распределяемая ¦

¦ область памяти ¦

¦ (растет вверх) ^ ¦

HeapOrg -->+----------------------------+<-- OvrHeapEnd

¦ оверлейный буфер ¦

+----------------------------+<-- OvrHeapOrg

¦ стек (растет вниз) v ¦

SSeg:SPtr -->¦............................¦

¦ свободный стек ¦

SSeg:0000 -->+----------------------------+

¦ глобальные переменные ¦

¦............................¦<-------

¦ типизированные константы ¦ ¦

DSeg:0000 -->+----------------------------+ ¦

¦ кодовый сегмент ¦ ¦

¦ модуля System ¦ ¦

¦............................¦ ¦

¦ кодовый сегмент ¦ ¦

¦ первого модуля ¦ ¦

¦............................¦ ¦

L----------------------------- содержимое

. кодовый сегмент . образа

. других модулей . файла .EXE

----------------------------- ¦

¦............................¦ ¦

¦ кодовый сегмент ¦ ¦

¦ последнего модуля ¦ ¦

+----------------------------+ ¦

¦ кодовый сегмент ¦ ¦

¦ главной программы ¦ ¦

+----------------------------+<--------

¦ префикс сегмента программы ¦

¦ (PSP) ¦

PrefixSeg -->L-----------------------------

Рис. 21.1 Схема памяти для программы реального режима DOS.

Сегмент данных (адресуемый через регистр DS) содержит все

типизированные константы, за которыми следуют все глобальные пе-

ременные. В процессе выполнения программы регистр DS никогда не

изменяется. Размер сегмента данных не может превышать 64К.

При входе в программу регистр сегмента стека (SS) и указа-

тель стека (SР) загружаются так, что пара регистров SS:SР указы-

вает на первый байт, следующий за сегментом стека. Регистр SS в

процессе выполнения программы никогда не изменяется, а SP может

перемещаться вниз, пока не достигнет нижней границы сегмента.

Размер сегмента стека не может превышать 64К. По умолчанию ему

назначается размер, равный 16К, но с помощью директивы компилято-

ра $М это значение можно изменить.

Оверлейный буфер используется стандартным модулем Overlay

для хранения оверлейного кода. По умолчанию размер оверлейного

буфера соответствует размеру наибольшего оверлея в программе. Ес-

ли программа не имеет оверлеев, то размер оверлейного буфера бу-

дет нулевым. Размер оверлейного буфера можно увеличить с помощью

вызова подпрограммы OvrSetBuf модуля Overlay. В этом случае раз-

мер динамически распределяемой области памяти соответственно

уменьшается, а HeapOrg перемещается вверх.

В динамически распределяемой области сохраняются динамичес-

кие переменные, то есть переменные, выделенные при обращениях к

стандартным процедурам New и GetMem. Она занимает всю свободную

память или часть свободной памяти, оставшуюся при выполнении

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

ласти зависит от максимального и минимального значений, которые

можно установить для динамически распределяемой области с помощью

директивы компилятора $М. Гарантированный минимальный размер ди-

намически распределяемой области не может быть меньше минимально-

го значения, установленного для этой области. По умолчанию мини-

мальные размер динамически распределяемой области равен 0 байт, а

максимальный - 640К; это означает, что по умолчанию динамически

распределяемая область занимает всю доступную память.

Подсистема динамического распределения памяти (являющаяся

частью библиотеки исполняющей системы), как можно догадаться, уп-

равляет динамически распределяемой областью. Детально она описы-

вается в следующем разделе.

Соседние файлы в предмете Программирование на Pascal