Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_2.DOC
Скачиваний:
13
Добавлен:
02.05.2019
Размер:
689.66 Кб
Скачать

2.4.Резидентные программы

      1. Системные средства организации резидентных программ

Программы, остающиеся в памяти, после того как управление возвращает­ся в DOS, называются резидентными (TSR — Terminate and Stay Resident). Превратить программу в резидент­ную просто — достаточно вызвать специальную системную функцию DOS ("Keep"):

Функция DOS 31h — Оставить программу резидентной

Ввод: АН = 31h

AL = код возврата

DX = размер резидента в 16-байтных параграфах (больше 06h), считая от начала PSP.

Кроме того, существует и иногда используется предыдущая версия этой функции — прерывание 27h:

INT 27h — Оставить программу резидентной

Ввод: АН = 27h

DX = адрес последнего байта программы (считая от начала PSP) + 1

Прерывание 27h не может оставлять резидентными программы разме­ром больше 64 Кб, но многие программы, написанные на ассемблере, соответствуют этому условию. Так как резидентные программы умень­шают объем основной памяти, их всегда пишут на ассемблере и оптими­зируют для достижения минимального размера.

Никогда не известно, по каким адресам в памяти оказываются загру­женные в разное время резидентные программы, поэтому единствен­ным несложным способом получения управления является механизм программных и аппаратных прерываний. Принято разделять резидент­ные программы на активные и пассивные, в зависимости от того, пере­хватывают ли они прерывания от внешних устройств или получают управление, только если программа специально вызовет команду INT с нужным номером прерывания и параметрами.

Независимо от этого типичная структура резидентной программы выглядит следующим образом:

code segment

assume CS:code, DS:code

org 100h ; СОМ-программа

main proc

jmp init ; переход на секцию инициализации

[. . .] ; данные резидентной секции программы

entry: ; точка входа при активизации

[. . .] ; текст резидентной секции программы

main endp

ressize = $-myproc ; размер (в байтах) резидентной секции

init proc ; секция инициализации

[. . .]

mov DX,(ressize+10Fh)/16 ; размер в параграфах

mov AX, 3100h ; функция "завершить и оставить в памяти"

int 21h

init endp

code ends

end main

Программа имеет две точки входа — main и entry. При первом запуске программы с клавиатуры управление передается на начало процедуры main. Командой JMP осуществляется переход на секцию инициализации, в которой, в частности, подготавливаются условия для дальнейшей активизации программы уже в резидентном состоянии. Последними строками инициализации вызывается функция 31h, выполняющая завершение программы с оставлением в памяти указанной ее части. С целью экономии памяти секция инициализации располагается в конце программы и отбрасывается при ее завершении. Действия, выполняемые секцией инициализации, называются установкой резидентной программы в памяти.

Содержательная часть программы начинается с метки entry и должна заканчиваться командой IRET.

Реальные резидентные программы, как правило, перехватывают целый ряд аппаратных и программных прерываний и имеют, соответственно, несколько точек входов активизации.

Реже резидентная часть активизируется командой CALL, тогда, разумеется, для окончания работы используется команда RET. Иногда требуется вмешательство в процесс передачи управления между процессами на уровне обычных переходов.

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

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