add dl, '0'
dec di
es mov b [di], '.'
dec di
es mov [di], dl
loop l1
inc time
cmp time, 15 ;проверка на окончание времени маскирования клавиатуры
jne end_060
in al, 021
and al, not bit irq
out 021, al ;размаскирование клавиатуры (IMR)
end_060:
pop es, di, ds, cx, bx, ax
iret
i08_hnd:
push ax, ds
mov ds, cs ;установка доступа к данным процедуры
inc cntr ;увеличение значения счетчика прерывании
cmp cntr, 18 ;проверка на прохождение 1 минуты (~990 мсек)
jne l10
mov cntr, 0 ;обнуление счетчика прерывании
int 060 ;вызов пользовательского прерывания
l10:
pop ds, ax
cs jmp old_v ;передача управления исходному обработчику
Программа маскирует доступ к клавиатуре на 15 секунд.
2.6. Маскирование доступа к клавиатуре с заменой функции 25h прерывания DOS 21h
Out6.8
include macr.inc
jmp start
old_v dd ? ;двойное слово для хранения значения вектора прерывания 08h
old_v1 dd ? ;двойное слово для хранения значения вектора прерывания 060h
cntr db 0 ;счетчик прерываний от таймера
time dw 0
irq equ 1
start:
schv old_v, 08, i08_hnd ;замена ВП системного таймера с запретом внеш. прерыв.
schv old_v1, 060, i060_hnd ;замена пользовательского ВП с запретом внеш. прерыв.
in al, 021
or al, bit irq
out 021, al ;маскирование клавиатуры (IMR)
mov ah, 0
int 016 ;ожидание прерывания от клавиатуры
srestv 08, old_v ;восстановление ВП системного таймера
srestv 060, old_v1 ;восстановление пользовательского ВП
mov ah, 04c
int 021 ;завершение выполнения программы
i060_hnd:
push ax, bx, cx, ds, di, es
mov es, 0b800 ;указатель на видеобуфер
mov bx, 10
mov cx, 3
mov di, 6
mov ax, time
l1:
mov dx, 0 ;преобразование числа секунд в ASCII код и отображение
div bx ;его на экране
add dl, '0'
dec di
es mov b [di], '.'
dec di
es mov [di], dl
loop l1
inc time
cmp time, 15 ;проверка на окончание времени маскирования клавиатуры
jne end_060
in al, 021
and al, not bit irq
out 021, al ;размаскирование клавиатуры (IMR)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.