; неправильный блок памяти
err10 db '>>> bad environment <<<',CR,LF,'$'
; неправильная среда
err11 db '>>> bad .EXE file format <<<',CR,LF,'$'
; неправильный формат файла .EXE
;
spoint dw ? ; память для указателя стека
param_block label word
dw 0 ; используемая среда порождающей программы
dw offset cmd_buf
p1 dw ? ; сегмент командной строки
dw 5Ch ; сегмент FCB #1 или смещение
p2 dw ?
dw 6Ch ; сегмент FCB #2 или смещение
p3 dw ?
cmd_buf db ? ; длина командной строки
db ' ' ; всегда предполагается пробел
cmd_txt db 80 dup (?) ; 80 символов
;
; Описание локального стека
EVEN ; слово выравнивания стека
stack db 32 dup ('stack ') ; локальный стек
TOP_STK EQU $-2 ; установка адреса вершины стека
LST_BYT EQU $ ; последний байт в программе
;
code_seg ENDS
END start
----------------------------------------------------------------
Второй режим называется Load Overlay (загрузка оверлейных
- 3-48 -
программ). Хотя в этом режиме загружается программный файл, режим
Load Overlay не выполняет вызов программы. Вместо этого управле-
ние сразу же возвращается в вызывающую программу. Этот режим вы-
бирается путем установки в регистре AL значения, равного 3. Блок
параметров для этого режима показан на Рис. 3-14.
В любом режиме функционирования перед выполнением функции
загрузки и выполнения программы блок начального распределения вы-
зывающей программы должен быть приведен в исходное состояние для
освобождения пространства памяти. MS-DOS загружает программы, ис-
пользуя программный загрузчик файла COMMAND.COM, который не явля-
ется резидентной частью файла COMMAND.COM. Программный загрузчик
должен считать в память сам себя с диска перед тем, как он сможет
загрузить программу пользователя или оверлейную программу. (Это
также предполагает, что в системе для этой функции должен рабо-
тать диск, содержащий файл COMMAND.COM).
РЕГИСТРЫ ВНЕШНИЙ СЕГМЕНТ
.----------------.
AX:4B03(шестн.) <------ Функция Load Overlay | ... |
|----------------|
BX:указатель на имя файла в коде ASCIIZ ----->| имя файла/пути |
| нулевой байт |
DX: указатель на блок параметров ------. |----------------|
| | ... |
| \/\/\/\/\/\/\/\/
|
Адрес ПАМЯТЬ СИСТЕМЫ | СЕГМЕНТ ДАННЫХ
0000:0000 .----------------. | .----------------.
|Система или по- | | | |
|рождающая прог- | | | ... |
| рамма | | | |
| ... | ----->|----------------|
| | |Адрес загрузоч- |
xxxx:0000 |----------------|<-----------------|ного сегмента |
| Программный код| |----------------|
| ... | |Фактор настройки|
|----------------| |----------------|
| | | |
\/\/\/\/\/\/\/\/ \/\/\/\/\/\/\/\/
Рис.3-14. Блок параметров для функции 4Bh (al = 3) -
LOAD OVERLAY (Загрузка оверлейной программы)
Между загрузкой оверлейной и исполнимых программ имеется су-
щественное отличие. Оверлейная программа загружается под управле-
нием порождающей программы по адресу, определенному порождающей
программой, и считается частью порождающей программы. Программные
файлы, предназначенные для выполнения (функция 4Bh с регистром AL
= 0), загружаются по адресу, выбираемому системой MS-DOS, и рас-
сматриваются как отдельная программа.
Загрузка и выполнение программ через MS-DOS (код 4Bh с AL=0)
При использовании функции загрузки и выполнения MS-DOS тре-
бует не только достаточного количества свободной памяти для за-
грузки программного загрузчика файла COMMAND.COM, но также
достаточное количество свободной памяти для размещения новой
- 3-49 -
программы. Эта память используется также для создания блока на-
чального распределения новой программы. Вспомните, что блок на-
чального распределения порождающей программы должен быть установ-
лен достаточно большим для предохранения текущей программы, или
перезаписи блока операционной системой MS-DOS при загрузке новой
программы. Кроме того, большинство резидентных подпрограмм или
RTL написаны в формате типа .COM. Для программ типа .COM операци-
онная система MS-DOS устанавливает стек в начало наивысшего адре-
са доступной памяти в общем сегменте, который используется для
программного кода, данных и стека. Если вершина стека не настраи-
вается внизу сегмента, то может быть защищено до 64 Кбайт порож-
дающей программы. Если же стек настраивается внизу сегмента, то
все, что находится в стеке, будет потеряно (например, при возвра-
те в MS-DOS). Конечно, возврат в MS-DOS в стеке не нужен, если
используется функция с кодом 4Ch.
Наследство и управление порожденной программой
Даже если порожденная программа автономна, порождающая прог-
рамма все же имеет степень воздействия на поведение порожденной
программы. Это воздействие выполняется через наследство, т.е.
возможность порождающего процесса воздействовать каким-либо обра-
зом на связь порожденного процесса с остальной системой.
Из Рис. 3-13 можно видеть, что порождающий процесс применяет
порожденный процесс с командной строкой, блоком среды (или с бло-
ком порождающего процесса, если блок не указан в вызове EXEC) и
блоками управления файлами. Кроме того, когда процесс загружает-
ся, он автоматически наследует большинство сегментов программого
префикса своей программы, включая таблицу описателей файлов по-
рождающей программы. При манипулировании этими элементами порож-
дающая программа управляет тремя первичными элементами, управляю-
щими программой: ее командной строкой, ее таблицей описателей
файлов и ее блоком среды.
Между командными строками: передаваемой в порожденный про-
цесс, и используемой в приглашениях системы имеются некоторые от-
личия. В первом случае командная строка становится ответственной
порождающего процесса за установку любого переназначения - зада-
чи, обычно обрабатываемой файлом COMMAND.COM. Т.к. порожденный
процесс наследует таблицу описателей файлов порождающего его про-
цесса, то порождающий процесс может легко переназначить ввод/вы-
вод порожденного им процесса. При изменении значений описателей,
хранящихся в устройствах стандартного ввода и вывода stdin и
stdout порождающего процесса, порождающий процесс изменит пред-
шествующие как stdin, stdout, так и любые другие допустимые уст-
ройства порожденного процесса. Порождающий процесс может изменить
их, используя технические приемы, показанные в листинге 3-3 (в
разделе "Таблица описателей файлов PSP"), или путем использования
функций MS-DOS для манипулирования файлами и устройствами. (Одной
из таких функций, которая может быть использована для замены об-
работки, является функция MS-DOS с кодом 46h "Использовать дубли-
кат описателя"- прерывание int 21h).
Заметим, что полная обработка может быть включена из су-
щества наследования. При открытии файла или устройства должен
быть указан режим OPEN (открыть) (Смотри функцию MS-DOS с кодом
3Dh "Открыть файл или устройство" - прерывание int 21h), при этом
бит 7 режима OPEN является битом наследования. При установке это-
го бита в 0 (принимается по умолчанию), обработка должна быть
- 3-50 -
наследуемой с каким-либо порожденным процессом. Если этот бит ус-
тановлен в 1 при вызове функции OPEN, то возвращаемая обработка
будет освобождена от наследования.
Существует другой способ, при котором порождающий процесс мо-
жет управлять системным отображением порожденного процесса. Пер-
вый элемент в блоке параметров загрузки и выполнения является
указателем на блок среды порожденного процесса. Если указатель в
блоке параметров загрузки и выполнения равен нулю, то для порож-
денного процесса дублируется среда порождающего процесса. Если он
не равен нулю, то в качестве среды порожденного процесса загружа-
ется блок среды, указываемый этим указателем.
Что же это означает для Вас? Это означает, что можно написать
программу поиска блоков среды для отдельных элементов и затем ис-
пользовать эти значения для установки параметров во время выпол-
нения программы. Элементы могут быть вставлены в блок среды сис-
темы по команде SET (установить) для управления действиями
программы, которая читает и действует со своим блоком среды. Так
как порождающий процесс может изменять блок среды, то тем самым
порождающий процесс может изменять поведение порожденного процес-
са, читающего этот блок.
Выполняющийся процесс может осуществлять доступ к своему бло-
ку среды посредством указателя, хранящегося по смещению 2Сh в
PSP. Указатель используется в качестве адреса сегмента с нулевым
смещением, указывающим на начало блока. Если этот адрес передает-
ся в регистре внешнего сегмента или в регистре данных, то прог-
рамма может выполнить поиск строки для нахождения требуемых пара-
метров. При этом будьте осторожны, потому что можно потерять
адрес PSP.
Информация, содержащаяся в PSP, действительна как для файлов
типа .COM, так и для файлов типа .EXE, и любой тип файла может
быть использован с функцией загрузки и выполнения программы.
Выполнение команд MS-DOS с функцией 4Bh
Одним из приложений функции загрузки и выполнения является
загрузка файла COMMAND.COM. Если принять во внимание, что файл