Для запуска дочерней программы служит функция 4Bh, прерывания 21h.
AH=4Bh
AL=0
ES:BX=адрес блока параметров
DS:DX=адрес имени программы в формате ASCIIZ формате
Ошибка CF=1
Блок параметров занимает 7 слов:
Первое слово – адрес нового сегмента окружения
Два слова – адрес хвоста программы. Четыре слова – в настоящее время не используются.
Пример. Блок параметров и новое окружение программы.
parmblk dw envseg
dd cmdtail
4 dw dup(0)
cmdtail db 9,’ FILE.TXT’,0Dh
envseg segment ‘ENVIR’
db ‘WORK=c:temt.dat’,0
db 0
envseg ends
Предварительно, перед запуском новой программы, нужно освободить лишнюю память с помощью функции 4Ah. Данная функция требует указания размера памяти, который занимает родительская программа. Для реального определения размера программы в формате ЕХЕ ее замыкают фиктивным сегментом и применяют команду sub для вычитания из адреса фиктивного сегмента адреса начала программы.
AH=4Ah
BX=блок в параграфах
ES=сегментный адрес модифицируемого блока
Ошибка CF=1
Пример запуска программы.
;EXE program
codesg segment 'CODE'
assume CS: codesg,DS:
datasg,SS: stacksg
begin:
mov AX,datasg
mov DS,AX
;----------------------------
mov AX,fict ;адрес
;фиктивного сегмента
mov BX,ES ;адрес PSP
;программы
sub AX,BX ;размер
;программы
;----------------------------
mov BX,AX ;освобождение
;памяти
mov AH,4Ah
int 21h
;----------------------------
push DS :ES -> DS
pop ES
mov AH,4Bh
mov AL,0
mov BX,offset parmblk
mov DX,offset procname
int 21h ;запуск дочерней
;программы
jc errex
jmp fin
;-----------------------------
errex: ;ошибка запуска
mov AH,09h
mov DX,offset mes
int 21h
fin:
mov AX,4C00h
int 21h
codesg ends
datasg segment 'DATA'
parmblk dw 7 dup (0)
;дочерняя программа
procname db 'proc.exe',0
mes db 'Error !!!',10,13,'$'
;-------------------------
datasg ends
stacksg segment stack 'STACK'
dw 128 dup (0)
stacksg ends
;фиктивный сегмент
fict segment 'FICT'
fict ends
end begin