Замена обработчика прерываний. Замена обработчика средствами DOS. Функция получения нулевого обработчика

Страницы работы

20 страниц (Word-файл)

Содержание работы

1.  Замена обработчика прерываний


Замена обработчика средствами DOS

jmpstart

msg  db 'My string',13,10,'$'

n_vectequ 0 ;

old_v   dd ?

start:

    mov al, 0

    mov ah, 035h

    int 021h

    mov w old_v,   bx

    mov w old_v+2, es

Вызвали функцию получения нулевого обработчика

lea dx, new     

    mov ds, cs      

    mov al, 0

    mov ah, 025h

    int 021h

Вызвали функцию установки нулевого обработчика

    mov ax,0

mov bl,0

    div bl

Вызов прерывания

mov dx, w old_v     

    mov ds, w old_v+2

    mov al, 0

    mov ah, 025h

    int 021h

Замена обработчика на старый

exit:mov al,0

    mov ah,04C

    int 021h

Код фукнции обработчика

new: print msg

    pop bx

    inc bx

    inc bx

    push bx

    iret


Замена обработчика без средств DOS

start:

    lea ax, new      ;

    mov dx,cs       

    mov ds,0

   xchg w [n_vect*4],ax;

    xchg w [n_vect*4+2],dx

    mov ds, cs

    mov w old_v,ax

    mov w old_v+2,dx

Заменили обработчик

Генерация прерывания

    mov ax, w old_v

    mov dx, w old_v+2

    mov ds,0

    mov w [n_vect*4], ax

    mov w [n_vect*4+2],dx    mov ds, cs;

Обратная замена прерываний

Обработчик с вызовом стандартного

new:  

    print msg

    pushf

    call old_v

    pop bx

    inc bx

    inc bx

    push bx

    ;jmp old_v

    iret



2.  Прерывания трассировки


jmp start

mark db '*  $'

n_vect  equ 1

old_v   dd ?

mask_off dw not bit 8

mask_on dw bit 8

start:

    mov al, n_vect

    mov ah, 035h

    int 021h

    mov w old_v,   bx

    mov w old_v+2, es

    lea dx, new

    mov ds, cs

    mov al, n_vect

    mov ah, 025h

    int 021h

Заменили обработчик

    mov cx, 5

    pushf

    pop ax

    or ax, mask_on

    push ax

    popf

Установка бита T

incbx:  inc bx

    loop incbx

    pushf

    pop ax

    and ax, mask_off

    push ax

    popf

Сняли бит T

    mov dx, w old_v     

    mov ds, w old_v+2

    mov al, n_vect

    mov ah, 025h

    int 021h

exit:   mov al,0

    mov ah,04C

    int 021h

new: print mark

    iret


Сброс T в обработчике int 01

new:  

    print mark

    cmp cx, 0

    jnz endnew

    print msg

    pop ax

    pop bx

    pop dx

    and dx, mask_off

    push dx

    push bx

    push ax

endnew:

    iret

Использование int 3 для отладки

new3: 

    pop ax

    pop bx

    pop dx

    not dx

    push dx

    push bx

    push ax

    iret



3.  Аппаратные прерывания


Обработчик прерываня таймера (int8)

set_seg macro

    mov ax, #l

#qxbl1

    mov #x, ax

#em

new:

push bx,ax,ds,es;    set_seg ds,cs

    mov ax,13

    mov bx,40

    lea si,msg

    call print;

Печать звездочки

    mov al, 020; out 020,al Сброс заявки прерывания

    pop es,ds,ax,bx; iret

Маскирование клавиатуры

start:

Перехват обработчиков

       in al,21h    

       or al,2       

установка бита 1 отключаем клавиатуру

       out 21h,al

Восстановление перехваченных обработчиков

exit:

       int 020h     


Перехват обработчика клавиатуры (int 9)

new9: 

    push ax,ds,es

    set_seg ds,cs

    in ax, 060

    cmp al,1

    jne notflag

    mov flag,1

notflag:

    pop es,ds,ax

es jmp old_v9

    iret

(скан код Escape = 1)



4.  Многонитевое функционирование

#include <stdio.h> <pthread.h> <unistd.h> <signal.h>

pthread_t t1,t2;

void handler (int sig_num)

{

printf("User has cought signal %d\n",sig_num);

pthread_exit(NULL);

}

void * thread1(void*a)

{

  int time = 0;

  signal(SIGUSR1,handler);

  while (time < 10){

    printf("Thread1. 1sec intervals - %d\n",time);

    time++;    sleep(1);

  }

  return NULL;

}

void * thread2(void* a)

{

  int time = 0;

  while (time < 4){

    printf("Thread2. 5sec intervals - %d\n",time);

    time++;    sleep(5);

    if (time ==1){

       pthread_kill(t1,SIGUSR1);

    }

  }

  return NULL;

}

int main (void){

  pthread_create(&t1,NULL,thread1,NULL);

  pthread_create(&t2,NULL,thread2,NULL);

  pthread_join(t1,NULL);

  pthread_join(t2,NULL);

  printf ("Process state bwfore closing:\n");

  system("ps f");

  return 0;

}

5.  Механизм ненадежных сигналов

#include <signal.h> <stdio.h>

typedef void (*sighandler_t)(int);

sighandler_t prev_usr1;

sighandler_t prev_usr2;

void SigUsr1 (int sig_num)

{

printf("FATHER USR1 caught signal #%d\n",sig_num);

    printf("PPID = %d, PID = %d\n",getpid(),getpid());

signal(SIGUSR1,prev_usr1);

}

void SigUsr2 (int sig_num)

{

printf("FATHER USR2 caught signal #%d\n",sig_num);  

    printf("PPID = %d, PID = %d\n",getppid(),getpid());

signal(SIGUSR2,prev_usr2);

}

int main()

{

    int pid;     int i=0;

    prev_usr1 = signal(SIGUSR1,SigUsr1);

    prev_usr2 = signal(SIGUSR2,SigUsr2);

    signal(SIGINT,SIG_DFL);

    signal(SIGCHLD,SIG_IGN);

    printf("FATHER started... creating son process\n");

    pid = fork();

    if (!pid){

        execl("./son.out",NULL,NULL);

    }

    else

    for (i=0;i<4;i++){

        printf("FATHER will be paused now\n");

        pause();

    }

    return 0;

}

#include <signal.h>

int main()

{

Похожие материалы

Информация о работе