Оверлей, в та-
ком случае, содержит вызов функции завершения программы.
Все способы доступа к оверлею (либо по инструкции CALL, либо
по инструкции JMP) должны быть ссылками far (далекий). Програм-
мный код, загружаемый в оверлей, является относительным по отно-
шению к собственному адресу сегмента и не может располагаться в
- 3-53 -
том же самом сегменте, что и порождающая программа (хотя он может
быть загружен в тот же самый участок памяти).
Кроме того, с по-
мощью функции "загрузить оверлей" не строится блок PSP. Так как
отсутствует дополнительная информация, помещаемая в память за-
грузчиком, программные коды и данные из оверлейного файла загру-
жаются, начиная точно с указанного адреса загрузки.
Рассмотрим простейший случай : оверлей, загружаемый из файлов
формата .COM.
файловый менеджер, файловый менеджер, norton, программы архиваторы, офисные программы, .
asplinux deluxe
Это имеет место потому, что по-
рождающая и порождаемая программы, на самом деле, являются частя-
ми одной и той же программы. Все, что выполняет функция загрузки
программного оверлея, это загрузка дополнительного программного
кода (и/или данных программы) в память.
Другим отличием загрузки оверлея от загрузки и выполнения яв-
ляется то, что загрузка оверлея не требует блок памяти его вла-
дельца. Загрузка оверлея не передает блок среды или блок началь-
ного распределения, как функция загрузки и выполнения программы.
Функция загрузки оверлея просто загружает запрашиваемый файл в
память, настраивая значения сегментов программы в соответствии с
параметрами, обеспечиваемыми при вызове функции (как показано на
Рис.3-14). Полученный программный код может быть выполнен как
подпрограмма, но не должен выполняться как отдельная программа.
Если оверлей завершается посредством одной из функций завер-
шения MS-DOS, то завершается и оверлей и порождающая программа.
Если для выхода используется функция 31h или функция 27h ("завер-
шить и оставить резидентной"), то модифицируется блок начального
распределения порождающей подпрограммы, а порождающая программа
остается в памяти. Порожденная программа останется резидентной
только тогда, когда блок запрошенной памяти является достаточно
большим, вмещающим и порождающую и порожденную программы. Если
выполняется одна из функций завершения программ, то обе программы
удаляются из памяти.
Рис.3-14 показывает, что фактор настройки, указываемый как
часть функции загрузки оверлея, не воздействует на адрес загрузки
оверлея. Вместо фактора настройки используется модификация смеще-
ния ссылок внутри загружаемой программы. Если оверлей загружается
в формате .COM, то фактор настройки не воздействует на загружае-
мый оверлей и должен быть установлен в нулевое значение.
Для программных файлов типа .EXE фактор настройки добавляется
к значениям ссылок сегментов, которые появились в файле загрузки.
При загрузке большинства оверлейных программ типа .EXE (которые
обычно первоначально по умолчанию 0000:0000) фактор настройки
должен быть установлен в то же самое значение, что и адрес заг-
рузки.
Доступ к программному оверлею из порождающей программы
После загрузки программного оверлея порождающая программа
должна осуществить к нему доступ. Так как порождающая программа
знает адрес, по которому был загружен программный оверлей, то для
доступа к оверлею она может выдать инструкцию CALL или инструкцию
перехода JMP. Обращаться к оверлею по инструкции CALL рекоменду-
ется по той причине, что оверлей затем сможет возвратиться в по-
рождающую программу путем использования инструкции RET, чем запо-
минать адрес возврата в порождающую программу для инструкции JMP.
Если же возвращать управление в порождающую программу не нужно,
то предпочтительнее использование инструкции JMP.