div bl
add ax,3030h ; преобразование в ASCII
mov word ptr es:msg+1,ax
mov ax,0b800h ; цветной дисплей
mov es,ax
lea bx,msg
mov di,0 ; место отображения сообщения
mn1:
mov al,[bx]
cmp al,'$'
je exit
mov es:[di],al
inc di
inc bx
mov es:[di],word ptr 15h ; атрибуты вывода сообщения
inc di
jmp mn1
exit:
cmp sec,20
jne time
mov al,0
out 21h,al
mov ax,0h
int 16h
push ds
mov dx, ip8
mov ax, cs8
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, ip60
mov ax, cs60
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 ah,4ch ; завершение работы программы
int 21h
main ENDP
myint8 proc FAR ; обработчик прерывания
push ax ; сохранение контекста
push es
mov ax, dseg
mov es,ax
mov ax,word ptr es:cnt ; вычисление количества прерываний int8
inc ax
cmp ax,18 ; вызов int60, если поступило 18 int8
jne m0
int 60h
mov ax,0
m0:
mov word ptr es:cnt,ax
pop es
pop ax
mov ax,dseg
mov es,ax
jmp dword ptr es:adr8i ; управление - стандартному обработчику
myint8 ENDP
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.8. Изменение программы – выход по «горячей клавише».
Выхода по «горячей клавише» - перехват аппаратного прерывания от клавиатуры int9h.
prog8.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
klav dw 0h
adr8i:
ip8 dw 0h ; вектор обработчика
cs8 dw 0h
adr9i:
ip9 dw 0h ; вектор обработчика
cs9 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.