
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
B.Pascal 7 & Objects/LR - 404 -
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.