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
Обратите
внимание на отсутствие инструкции STI,
чтобы разрешить дальнейшие прерывания.
С помощью оператора 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.