Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_ОС_и_среды.rtf
Скачиваний:
68
Добавлен:
13.09.2019
Размер:
13 Мб
Скачать
☆

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

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

6.5. Макрокоманды

Макрокоманды позволяют автоматизировать частое обращение к командам, набор которых одинаковый, но выполняются они с различными данными. Формат макрокоманды ассемблера имеет вид:

name macro p1,p2,…,pi

;команды

endm

p1,p2,…,pi – формальные параметры команды.

Вызов макроса

name n1,n2,…,ni

n1,n2,…,ni – фактические значения для команды.

Пример использования макрокоманды:

codesg segment 'code'

assume cs:codesg,ss: codesg,ds: codesg

org 100h

getmes macro off ;вывод произвольного сообщения

mov ah,09h

mov dx,off

int 21h

endm

begin:

mov dx,offset mes

getmes dx ;обращение к команде

mov AX,4c00h

int 21h

bufer db 128 dup(0)

mes db 'Hello World !!!',0ah,0dh,'$'

codesg ends

end begin