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

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                   ; преобразование количества часов