Запуск одной программы из другой

Для запуска дочерней программы служит функция 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