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
Заме
|