myint60 proc FAR ; обработчик прерывания
push ax ; сохранение контекста
push es
mov ax, dseg
mov es,ax
mov es:flag,1 ; установка флага - изменение времени
mov ax,word ptr es:sec ; инкрементация счетчика секунд и его сброс
inc ax
cmp ax,60
jne ms
mov ax,0
mov word ptr es:sec,ax
jmp mm
ms:
mov word ptr es:sec,ax
jmp m_ex
mm:
mov ax,word ptr es:min ; инкрементация счетчика минут и его сброс
inc ax
cmp ax,60
jne mm_m
mov ax,0
mov word ptr es:min,ax
jmp mh
mm_m:
mov word ptr es:min,ax
jmp m_ex
mh:
mov ax,word ptr es:hour ; инкрементация счетчика часов и его сброс
inc ax
cmp ax,24
jne mh_h
mov ax,0
mov word ptr es:hour,ax
jmp m_ex
mh_h:
mov word ptr es:hour,ax
m_ex:
pop es
pop ax
mov al,20h ; снятие заявки на обслуживание (ISR)
out 20h,al
iret
myint60 ENDP
cseg ENDS
END work
Результаты работы программы:
В левом верхнем углу экрана мы видим надпись “ НН:MM:SS” розового цвета на синем фоне, SS, MM, HH – время работы программы в часах, минутах, секундах. Программа работает 20 секунд, нажатые за это время клавиши сохраняются в буфере клавиатуры, по окончании блокировки они обрабатываются стандартным обработчиком прерывания от клавиатуры.
Нажатие клавиш Ctrl+Alt+Del – перезапуск компьютера после завершения работы программы (через 20 секунд).
2.7. Маскирование доступа к клавиатуре на 20 секунд с заменой функции 25h прерывания DOS 21h на ассемблерный эквивалент.
prog7.asm
sseg SEGMENT STACK ; сегмент стека
db 64 dup (?)
sseg ENDS
dseg SEGMENT PARA PUBLIC 'DATA'
cnt dw 0h
sec dw 0h
min dw 0h
hour dw 0h
flag dw 0h
adr8i:
ip8 dw 0h ; вектор обработчика
cs8 dw 0h
adr60i:
ip60 dw 0h ; вектор обработчика
cs60 dw 0h
msg db ' : : $'
dseg ENDS
cseg SEGMENT
main proc FAR
; связь между регистром сегмента и сегментом программы
ASSUME cs:cseg, ds:dseg, ss:sseg
work: mov ax, dseg ; инициализация сегмента данных dseg
mov ds, ax
; установка вектора прерывания int8
mov ax,3508h ; получение адреса обработчика (вектор прерывания)
int 21h
mov ip8, bx ; сохранение указателей на программу обработки
mov ax, es
mov cs8, ax
; установка вектора прерывания int60
mov ax,3560h ; получение адреса обработчика (вектор прерывания)
int 21h
mov ip60, bx ; сохранение указателей на программу обработки
mov ax, es
mov cs60, ax
push ds
mov dx, offset myint8 ; получение адреса обработчика
mov ax, seg myint8
mov ds, ax
mov ax,0
mov di,8h
mov es,ax
shl di,2h
cli ; блокировка аппаратных прерываний
mov es:[di],dx
mov ax,ds
mov es:[di]+2,ax
sti ; разблокировка прерываний
pop ds
push ds
mov dx, offset myint60 ; получение адреса обработчика
mov ax, seg myint60
mov ds, ax
mov ax,0
mov di,60h
mov es,ax
shl di,2h
cli ; блокировка аппаратных прерываний
mov es:[di],dx
mov ax,ds
mov es:[di]+2,ax
sti ; разблокировка прерываний
pop ds
mov al,2
out 21h,al
time: ; цикл, ограничивающий время работы
cmp flag,0 ; проверка на изменение секунд
je exit
mov flag,0
mov ax,sec ; преобразование количества секунд
mov bl,10
div bl
add ax,3030h ; преобразование в ASCII
mov word ptr es:msg+7,ax
mov ax,min ; преобразование количества минут
div bl
add ax,3030h ; преобразование в ASCII
mov word ptr es:msg+4,ax
mov ax,hour ; преобразование количества часов
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.