Обработчик прерываний от таймера


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

— прерывания, инициализирующие обработчик, могут быть аппаратными (от периферийных устройств) или программными (команда int);

— обработчик может входить в состав прикладной программы или представлять собой самостоятельную программную единицу. В последнем случае он относится к специальному классу резидентных программ;

— вектор обрабатываемого прерывания может быть свободным или использоваться системой или какой-либо резидентной прикладной программой;

— если вектор уже используется системой, т.е. в составе DOS имеется системный или прикладной обработчик прерываний с данным номером, то новый обработчик может полностью заменять уже загруженный (превращая его тем самым в бесполезную программу) или “сцепляться” с ним;

— в случае сцепления с загруженным ранее обработчиком новый обработчик может выполнять свои функции до уже имеющегося в системе или после него.

В предложенной программе использован самый простой вариант обработки прерывания в качестве обработчика прерывания 1Ch.

clip_image001Для того, чтобы прикладные программы могли использовать сигналы таймера, не нарушая при этом работу системных часов, в программу BIOS, обслуживающую аппаратные прерывания от таймера, поступающие через вектор 08, включен вызов
int 1Ch, передающий управление на программу-заглушку BIOS, которая содержит единственную команду iret (см рис.). Пользователь может записать в вектор 1Ch адресс прикладного обработчика сигналов таймера и использовать в своей программе средства реального времени. Естественно, перед завершением программы следует восстановить старое значение вектора 1Ch.

Главная процедура начинается с инициализации сегментного регистра DS. Перед тем, как устанавливать собственный обработчик какого-либо прерывания, следует сохранить его исходный системный вектор, чтобы перед завершением программы вернуть систему в исходное состояние. Для получения содержимого вектора 1Ch используется функция DOS 35h, которая возвращает содержимое указанного вектора в регистрах ES:BX. Для сокращения объема исходного текста программы, и номер функции и номер требуемого вектора заносится в регистры AH и AL одной командой. Исходный вектор сохраняется в двухсловной ячейке old_1Ch, объявленной директивой dd (define double, определить двойное слово) в сегменте данных программы. Однако команды пересылки не могут работать с двойными словами, поэтому сохраняемый вектор засылается из регистров ES:BX в память пословно, сначала младшую половину ячейки old_1Ch, затем в старшую, адрес которой равен old_1Ch+2.

Сохранив вектор, программа приступает к заполнению его адресом своего обработчика. Для этого используется функция DOS 25h, которая, как уже отмечалось, требует указания в регистре AL номера заполняемого вектора, а в регистрах DS:DX полного адреса обработчика, который и будет записан в указанный вектор. Регистр DS настроен на сегмент данных программы, поэтому на время выполнения функции 25h необходимо изменить содержимое DS, настроив его на тот сегмент, в котором находится процедура обработчика, т.е. на сегмент команд. Содержимое DS сохраняется в стеке, а затем в него через стек заносится содержимое регистра CS, который указывает на сегмент команд. После возврата из DOS в программу исходное содержимое DS восстанавливается.

Начиная с этого момента, прерывания от таймера, приводящие к выполнению в системной программе BIOS команды int 1Ch, будут активизировать 18,2 раз в секунду программу обработчика.

Рассмотрим теперь саму программу обработчика прерывания от таймера. Программа начинается с сохранения в стеке регистров, которые будут использоваться в обработчике. Это черезвычайно выжное действие, так как переход на программу обработчика осуществляется по команде int 1Ch из системной программы обработки прерываний от таймера. При выполнении процедуры прерывания, процессор настраивает должным образом только регистры CS и IP. Содержимое всех остальных регистров (в том числе и сегментных) отражает состояние системной программы, и если оно будет изменено, то после возврата из нашего обработчика в вызвавшую его системную программу, она перестанет функционировать.

После восстановления сохраненных в стеке регистров работа обработчика завершается командой iret, которая передает управление назад в вызвавшую наш обработчик программу BIOS. Когда эта программа дойдет до своего завершения, она выполнит команду iret и управление верентся в нашк программу в ту точку, в которой она была прервана сигналом таймера.

Загрузка...