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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

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()

{

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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.