Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Pascal Форум Информер Страны мира
   Резидентные Программы    >>    tp6intr
   
 
 Применение Interrupt в TP6  Петр Портянский 26.07.1993

Как написать свою процедуру обработки прерывания



1k 
 

From: Pete E. Portyansky <pete@cnii.tula.su> Subject: Re: int21 Organization: cniisu,Tula,Russia Fri, 23 Jul 1993 vitaly@stc.simbirsk.su (Vitaly Nikolaev) писал: > Мне нужно написать программу которая оставалась бы в > памяти резидентом и активировалась при вызове 21 пре- > рывания при этом она должна проверять какая функция > и если это открытие файла то выполняются определенные > действия а потом также как и в случае другой > функции управление передается стандартному обработчику > так чтобы другие программы ничего не заметили. > > Дело вот в чем: когда я объявляю процедуру interupted > то она автоматически запоминает регистры в стеке > после этого она выполняет действия и вызывает исходное > int21 которое возвращает какие то результаты которые > надо бы передать вызывающей программе, но в конце > моего обработчика опять же автоматически востанавливaются > регистры и получается, как будто ничего и не вызывалось. > Вот как с этим бороться ??????????????????? cut from user's guide 6.0 . my !!! Написание процедур прерывания. Процедура прерывания объявляется с директивой Interrupt. Каждая процедура прерывания должна иметь следующий заголовок (или часть его, как описано ниже): procedure IntHandler(Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); interrupt; begin ... end; Как Вы видите, все регистры передаются как псевдо-параметры. Так, что Вы можете их использовать и модифицировать в Вашем коде. !!!!! Вы можете опустить некоторые или все параметры, начиная с Flags и до BP. Будет ошибкой - объявить больше параметров, чем приведено в предыдущем примере или же пропустить параметр без пропуска всех стоящих до него (но сообщения об ошибке не будет). Пример: procedure IntHandler(DI,ES,BP : Word); {неверно} procedure IntHandler(SI,DI,DS,ES,BP : Word); {неверно} На входе процедура обработки прерываний автоматически сохраняет все регистры (вне зависимости от заголовка процедуры) и инициализирует регистр DS : push ax push bx push cx 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 Заме