Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Primery_nebolwih_podprogramm_na_Assembl-.doc
Скачиваний:
2
Добавлен:
14.05.2015
Размер:
161.79 Кб
Скачать

Запуск дочерней программы

DOS выделяет всю доступную память текущей программе, независимо от того, какой объем реально необходим. Поэтому вы должны освободить часть памяти для того, чтобы загрузить и выполнить дочернюю программу. Это выполняется процедурой Setmem. Каждый параграф занимает 16 байт. Пространство, необходимое текущей программе вычисляется как размер в параграфах = Lseg - Psp + 1 где Lseg - сегмент, расположенный после последнего байта программы, а Psp - сегмент, в котором расположен psp программы.

Setmem proc

;Выделяет AX параграфов памяти текущей программе

:и очищает всю остальную память.

;Входные данные: количество выделяемых параграфов в AX

;Выходные данные: число реально выделенных параграфов в AX

mov BX,AX ;объем выделяемой памяти в 16-битных параграфах

mov AH,4Ah

int 21h ;ES должен указыват на сегмент PSP программы

mov AX,BX ;число выделенных параграфов

ret

Setmem endp

Следующий фрагмент кода запускает программу CHILD.COM с параметром /HELP.

;сегмент данныхt:

ChildName db 'CHILD.COM',0 ;имя файла в виде строки ASCIIZ

; сегмент кода:

mov AX,CS

mov SegCmdLine,AX

mov SegFCB1,AX

mov SegFCB2,AX

push DS ;сохраняем регистры

push ES

mov CS:Shell_SS,SS ;сохраняем только регистр CS

mov CS:Shell_SP,SP

;exec-function

mov DX,offset ChildName ;DS:DX - указатель на строку, содержащую имя файла

mov AX,CS

mov ES,AX

mov BX,offset CS:Parm_Table ;таблица параметров ES:BX

mov AX,4B00h ;загрузить и выполнить программу

int 21h

cli ;запрещаем прерывания

mov SS,CS:Shell_SS ;восстанавливаем регистры

mov SP,CS:Shell_SP

sti ;разрешаем прерывания

pop ES

pop DS

cld ;флаг направления (direction flag) = 0

jc ThereWasError ;ошибка

; эти данные должны быть определены в сегменте кода

CmdLineTail db 6,' /HELP',13 ;6 - число символов

even ;faster this way

Shell_SS dw 0 ;указатель стека

Shell_SP dw 0

Parm_Table dw 0 ;наследуем переменные окружения родительской программы

dw offset CmdLineTail

SegCmdLine dw 0 ;сюда будет записан CS

dw 5Ch ;блок управления файлом (FCB) #1

SegFCB1 dw 0 ;сюда будет записан CS

dw 6Ch ;блок управления файлом (FCB) #2

SegFCB2 dw 0 ;сюда будет записан CS

Чтение параметров командной строки

Параметры командной строки (сразу после имени файла) могут быть прочитаны с помощью следующей процедуры ReadCL.

Например, если ваша программа называется KOE.COM и вы запускаете ее, набрав команду

KOE 4abcs

в командной строке DOS, то процедура ReadCL вернет строку 4abcs в формате ASCIIZ.

ReadCL proc ;чтение параметров командной строки в буфер по адресу ES:[DI]

;DS должен остаться неизменным после запуска программы (=PSP)

mov SI,80h ;адрес парамтеров

xor CX,CX

mov CL,[SI] ;длина в байтах

inc SI ;игнорируем байт длины

rep movsb ;перемещаем строку в буфер

mov AL,0

stosb ;завершаем строку ASCIIZ нулем

ret

ReadCL endp

Tsr: Завершаемся и остаемся в памяти

Инсталляция TSR-программы выполняется в три этапа:

  • Загрузка резидентной части в память. Проверка, не находится ли наша программа уже в памяти. Сохранение необходимой информации для дальнейшего удаления резидента из памяти. Освобождение памяти, занятой копией переменных окружения для экономии.

  • Установка параметров для работы резидентной части. Обычно на этом этапе перехватываются прерывания.

  • Завершение установочной программы, при этом резидентная часть остается в памяти.

;Структура программы TSR

Begin: ;Здесь начинается .COM-программа

jmp Install

;Сюда нужно поместить резидентную часть

Install:

;сюда поместите код установки

mov AH,31h ;завершиться и остаться резидентом

mov AL,0 ;возвращает результат =OK

mov DX,offset Install

mov CL,4

shr DX,CL ;делим на 16

add DX,1 ;объем резидентной части программы

int 21h

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]