Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Объясните принцип перехвата прерывания


Автор: PoluBOG 19.10.2002, 22:55
Передача значения, как расчитать адресс вектора. Мне надо перехватить и обработать 12 прерывание (порт пс/2 или мыха) для своих нестандартных целей) :hmmm

Автор: Chingachguk 28.10.2002, 18:00
Таблица векторов - массив из дальних адресов обработчиков, те каждый из них по 4 байта: offset:seg.

Вот пример перехвата ветора int 13h "руками":

Код

; es=0, Хотим сделать направленным вектор
; int 13h на наш обработчик @@New13Handler
       mov   di,13h*4          ; Hook int 13h
       mov   ax,offset @@New13Handler - 100h
       xchg  ax,word ptr es:[di]
       mov   word ptr Old13h-100h,ax
       mov   ax,cs
       xchg  ax,word ptr es:[di+2]
       mov   word ptr Old13h-100h+2,ax
       ...
; Вызов старого обработчика:
       mov   si,offset Old13h-100h
       ...
       pushf
       call  dword ptr ds:[si]; Execute It !


Вот пример перехвата вектора через ДОС:

Код

; Обработчик (новый) вектора 9H:
KEYb:PUSH  DS                                ; Entry Point For 09h
       PUSH  CS
       POP   DS
       PUSHF
       CALL  DWORD PTR OLD_9H
       ...
; Обработчик (новый) вектора 10H:
MESSAGE PROC NEAR
       PUSH  DS                                ; Entry Point For 10h
       PUSH  CS
       POP   DS
       MOV   BIOS_FLAG,0
       ...
; Перехватывем вектора int 9h (keyboard)
; и 10h (bios, display services)
       MOV   AL,09H
       MOV   DI,OFFSET OLD_9H
       MOV   DX,OFFSET KEYB
       MOV   SI,OFFSET LOAD_VECTOR
       CALL  SI
       MOV   AL,10H
       MOV   DX,OFFSET MESSAGE
       CALL  SI
       ...
; Код процедуры LOAD_VECTOR
LOAD_VECTOR PROC NEAR
       MOV  AH,35H
       INT  21H
       MOV  [DI],BX
       INC  DI
       INC  DI
       MOV  [DI],ES
       INC  DI
       INC  DI
       MOV  AH,25H
       INT  21H
       RET
LOAD_VECTOR ENDP


А вот как можно реализовать перехват вектора 1C (вспомогательный user-таймер) на языке Паскаль:
Код

{Обработчик прерывания}
procedure curs(flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp:word); interrupt;
begin
asm
@@new: push ax; push ds
      mov ax,seg @Data; mov ds,ax; mov ax,3
      int 33h
...
{Установка нового вектора}
var
old,new1:pointer;
n:byte;
begin
N:=(12+16);
getintvec(n,old); {Запомнить старый в old}
asm
mov word ptr new1,offset curs
mov word ptr new1+2,seg curs
end;
setintvec(n,new1); {Установить новый}
...
{Программа закочена, вернуть все назад}
n:=12+16;
setintvec(n,old);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)