Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТ_ОРГ_1.doc
Скачиваний:
29
Добавлен:
18.11.2019
Размер:
1.27 Mб
Скачать

Теоретическая часть (См. Также разделы 1.3 и 2.4)

3Организация прерываний и резидентные программы.

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

Резидентными называют программы, которые после своего завершения остаются в памяти и активизируются при наступлении каких-либо событий в вычислительной системе. Такими событиями могут быть, например, нажатие " горячей " комбинации клавиш, выполнение некоторых операций с дисками и т. п. Но в любом случае программа получает управление при тех или иных условиях. Все резидентные программы строятся одинаково, или почти одинаково, и состоят из двух секций - секции инициализации и собственно резидентной части. Резидентная часть, как правило, состоит из одной или нескольких подпрограмм-обработчиков прерываний и находится в памяти во время сеанса работы компьютера. Такие подпрограммы могут полностью подменять собой системные обработчики или только служить их дополнением. Естественно, для того, чтобы резидентная часть получила управление, необходимо заменить соответствующие вектора в таблице векторов прерываний на точки входа в заново установленные обработчики. Эту функцию и выполняет секция инициализации, которая всегда выполняется при запуске программы первой. После перехвата прерываний, которые должна обрабатывать резидентная часть, секция инициализации завершает программу, используя для этой цели прерывание или функцию резидентного завершения MS DOS. В результате резидентная часть остается в памяти и активизируется в случаях, предусмотренных автором программы. Часть инициализации в процессе работы больше не потребуется, поэтому оставлять ее в памяти бессмысленно, и она " затирается " MS DOS в случае необходимости. Примером резидента является драйвер мыши, всевозможные антивирусы, которые следят за тем, что делает та или иная программа и сообщают о ее действиях пользователю и пр. Большой класс программ, обеспечивающих функционирование вычислительной системы (драйверы устройств, оболочки DOS, русификаторы, интерактивные справочники и др.), должны постоянно находиться в памяти и мгновенно реагировать на запросы пользователя, или на какие-то события, происходящие в вычислительной системе. Такие программы носят названия программ, резидентных в памяти (Terminate and Stay Resident, TSR), или просто резидентных программ. Сделать резидентной можно как программу типа.СОМ, так и программу типа.ЕХЕ, однако поскольку резидентная программа должна быть максимально компактной, чаще всего в качестве резидентных используют программы типа .СОМ.

Программы, предназначенные для загрузки и оставления в памяти, обычно состоят из двух частей (секций) - инициализирующей и рабочей (резидентной). В тексте программы резидентная секция размещается в начале, инициализирующая - за ней. При первом вызове программа загружается в память целиком и управление передается секции инициализации, которая заполняет или модифицирует векторы прерываний, настраивает программу на конкретные условия работы (возможно, исходя из параметров, переданных программе при ее вызове) и с помощью прерывания DOS Int 21h с функцией 31h завершает программу, оставляя в памяти ее резидентную часть. Размер резидентной части программы (в параграфах) передается DOS в регистре DX. Указывать при этом сегментный адрес программы нет необходимости, так как он известен DOS. Для определения размера резидентной секции ее можно завершить предложением вида

Ressize = $ - main,

где main - смещение начала программы, а при вызове функции 31h в регистр DX заслать результат вычисления выражения (Ressize+10Fh)/16. Разность S - main представляет собой размер главной процедуры. Однако перед главной процедурой размещается префикс программы, имеющий размер 100h байт, который тоже надо оставить в памяти. Далее, при целочисленном делении отбрасывается остаток, т.е. происходит округление результата в сторону уменьшения. Для компенсации этого дефекта можно прибавить к делимому число 15 = Fh. Деление всего этого выражения на 16 даст требуемый размер резидентной части программы в параграфах (возможно, с небольшим кусочком секции инициализации величиной до 15 байт).

Функция 31h, закрепив за резидентной программой необходимую для ее функционирования память, передает управление командному процессору COMMAND.СОМ, и вычислительная система переходит, таким образом, в исходное состояние. Наличие программы, резидентной в памяти, никак не отражается на ходе вычислительного процесса за исключением того, что уменьшается объем свободной памяти. Одновременно может быть загружено несколько резидентных программ.

Для того, чтобы активизировать резидентную программу, ей надо как-то передать управление и, возможно, параметры. Как правило, активизация резидентной программы осуществляется с помощью механизма прерываний. Кроме того, специально для взаимодействия с резидентными программами в DOS предусмотрено мультиплексное прерывание 2Fh.

Рассмотрим типичную структуру резидентной программы и системные средства оставления ее в памяти. Как уже отмечалось, резидентные программы чаще всего пишутся в формате .СОМ:

code segment

assume CS:text,DS:text

org 100h

main proc

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

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

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

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

iret

main endp

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

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

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

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

int 21h                                   

init endp

code ends

end main

При первом запуске программы с клавиатуры управление передается на начато процедуры main (первый байт после префикса программы). Командой jmp осуществляется переход на секцию инициализации, в которой, в частности, подготавливаются условия для дальнейшей активизации программы уже в резидентном состоянии. Последними строками секции инициализации вызывается функция ЗШ, которая выполняет завершение программы с оставлением в памяти указанной ее части. С целью экономии памяти секция инициализации располагается в конце программы и отбрасывается при ее завершении.

Содержательная часть резидентной программы, начинающаяся с метки entry, активизируется, как уже отмечаюсь выше, с помощью аппаратного или программного прерывания и заканчивается командой iret. На рисунке 2.7 приведена типичная структура резидентной программы.

Рисунок 2.7- Структура резидентной программы.

Как видно из рисунка 2.7, резидентная программа имеет по крайней мере две точки входа. После загрузки программы в память командой оператора, вводимой на командной строке, управление передается в точку, указанную в поле завершающего текст программы оператора end (на рисунке - начало процедуры main). Для программ типа .СОМ эта точка входа должна соответствовать самой первой строке программы, идущей вслед за префиксом программы. Поскольку при загрузке программы должна выполниться ее установка в памяти, первой командой программы всегда является команда перехода на секцию инициализации и установки (jmp init на рисунке).

После установки в памяти резидентная программа остается пассивной и никак не проявляет своего существования, пока не будет активизирована предусмотренным в ней для этого способом. Эта, вторая точка вызова обозначена на рисунке меткой entry. Как правило, резидентная программа должна перехватывать то или иное прерывание, с тем чтобы программист или другие программы могли обратиться к ней. Давайте поподробнее рассмотрим прерывания.