Разработка процедур обработки прерываний
Процедуры обработки прерываний описываются с помощью дирек- тивы Interrupt. В каждой процедуре обработки прерываний должен определяться следующий заголовок процедуры (или, как будет пояс- няться далее, его подмножество):
procedure IntHandler(Flags,CS,IPAX,BX,CX,DX,SI,DI,DS,ES,BP: Word); interrupt; begin . . . end;
Как можно видеть, все регистры передаются в качестве псевдо- параметров, так что вы можете их использовать и изменять в своей программе. Вы можете опустить некоторые из параметров или все па- раметры, начиная с параметра Flag и кончая ВР. Попытка описать большее количество параметров или попытка опустить отдельный па- раметр без пропуска также того параметра, за которым он следует, является ошибкой, хотя сообщения о ней не выдается. Например:
procedure IntHandler(DI,ES,BP : Word); { недопустимый заголовок } procedure IntHandler(SI,DI,DS,ES,BP : Word); { допустимый заголовок }
При входе в нее процедура обработки прерываний автоматически сохраняет все регистры (независимо от заголовка процедуры) и ини- циализирует регистр DS:
PUSH AX PUSH BX PUSH DX PUSH SI PUSH DI PUSH DS PUSH ES
PUSH BP MOV BP,SP SUB SP,LocalSize MOV AX,SEG DATA MOV DS,AX
Обратите внимание на отсутствие процедуры СLI, чтобы разре- шить дальнейшие прерывания. С помощью оператора inline вы можете написать ее сами (если это необходимо). Набор операторов выхода восстанавливает регистры и выполняет функцию возврата прерывания:
MOV SP,BP POP BP POP ES POP DS POP DI POP SI POP DX POP CX POP BX POP AX IRET
Процедура обработки прерываний может модифицировать свои па- раметры. Когда обработчик прерываний возвратит управление, изме- нение описанных параметров приведет к изменению содержимого соот- ветствующих регистров. Это может оказаться полезным, когда вы используете обработчик прерываний в качестве пользовательского сервисного средства, аналогичного вызову функции DOS по инструк- ции INТ 21Н.
В процедурах обработки прерываний, обслуживающих прерывания, получаемые от аппаратных схем, следует воздерживаться от исполь- зования каких-либо программ ввода-вывода Турбо Паскаля или прог- рамм распределения памяти, поскольку они не являются реентера- бельными. Из-за их нереентерабельности нельзя также использовать никакие функции DOS.