Замена обработчика средствами 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
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
Обработчик прерываня таймера (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)
#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;
}
#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()
{
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.