Изучение принципов обработки аппаратных прерываний. Получение знаний о логике взаимодействия процессора и контроллера прерываний, страница 7

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