Таблица 5



Таблица 5

(0) 2seg_env сегментный адрес среды, которая создается родительской программой для запускаемой программы. Если в этом поле находится 0, то для запускаемой программы копируется среда родительской программы
(+2) 4cmd FAR-адрес строки параметров для запускаемой программы. Эта строка должна иметь такой же формат, как и в PSP, т.е. вначале идет байт со значением, равным количеству символов в строке параметров, а затем - сама строка параметров
(+6) 4fcb1 адрес блока FCB, который будет помещен в PSP со смещением 5Ch (в PSP помещается блок, а не адрес!)
(+10) 4fcb2 адрес блока FCB, который будет помещен в PSP со смещением 6Ch.

Запущенной программе доступны все файлы, открытые родительской программой.

Если родительская программа сама формирует среду для дочерней программы, она должна подготовить новую среду на границе параграфа и поместить значение сегментного адреса в поле seg_env блока EPB.

Приведем простую программу, которая запускает программу с именем PARM.COM из текущего каталога. Программу PARM.COM мы только что рассматривали, эта программа выводит на экран полученные ей в командной строке параметры. .MODEL small DOSSEG .STACK 100h .DATA path db "PARM.COM",0 command_line db 8,"Parm Str" epb dw 0 cmd_off dw ? cmd_seg dw ? fcb1 dd ? fcb2 dd ? .CODE .STARTUP mov bx,OFFSET command_line ; адрес командной mov cmd_off,bx ; строки для блока EPB mov cmd_seg,ds mov ax,ds mov es,ax mov bx,OFFSET epb ; ES:BX указывают на EPB mov dx,OFFSET path ; DS:DX указывают на путь ; запускаемой программы mov ax, 4B00h ; AH = 4Bh ; AL = 0 загрузить и выполнить int 21h .EXIT 0 END

Эта программа использует модель памяти SMALL, и ее загрузочный модуль имеет формат EXE. При редактировании был указан стандартный для Quick C 2.01 размер памяти, требуемый для программы. Если попытаться использовать формат COM в модели TINY, то окажется, что вся память распределена COM-программе и для дочерней программы не осталось места.

Следующая программа освобождает всю неиспользуемую ей память, после чего на освободившееся место загружает программу PARM.COM: .MODEL tiny DOSSEG .STACK 100h .DATA path db "PARM.COM",0 command_line db 8,"Parm Str" epb dw 0 cmd_off dw ? cmd_seg dw ? fcb1 dd ? fcb2 dd ? .CODE .STARTUP ; ; Освобождаем лишнюю память за концом программы ; mov bx,OFFSET last ; смещение конца ; программы mov cl,4 ; вычисляем длину в ; параграфах shr bx,cl add bx,17 ; добавляем 1 параграф для ; выравнивания и 256 байт ; для стека mov ah, 4Ah ; изменяем размер выделенного int 21h ; блока памяти mov ax,bx ; установка нового значения shl ax,cl ; указателя стека dec ax mov sp,ax mov bx,OFFSET command_line ; адрес командной mov cmd_off,bx ; строки для ; блока EPB mov cmd_seg,ds mov ax,ds mov es,ax mov bx,OFFSET epb ; ES:BX указывают на EPB mov dx,OFFSET path ; DS:DX указывают на путь ; запускаемой программы mov ax, 4B00h ; AH = 4Bh ; AL = 0 загрузить и ; выполнить int 21h .EXIT 0 last: db ? END

Для изменения размера выделенного программе блока памяти мы использовали функцию 4Ah прерывания 21h.

Подфункции 1 и 2 прерывания 4Bh используются DOS (это внутренние подфункции DOS). Мы приведем недокументированный формат блока EBP для этих функций.

Для подфункнкции 1:



- Начало - - Назад - - Вперед -