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

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 – время работы программы в часах, минутах, секундах. Программа работает до нажатия клавиши Esc, нажатые за это время другие клавиши сохраняются в буфере клавиатуры, по окончании блокировки они обрабатываются стандартным обработчиком прерывания от клавиатуры. Был изменен обработчик прерывания от клавиатуры. Нажатие клавиши Esc – завершение программы, другая клавиша - стандартный обработчик прерываний от клавиатуры.

2.9. Изменение программы – вывод на экран часов суточного времени.

В начале основной программы следует применить вызов функции 2Ch прерывания DOS 21h - в РОН записывается текущее системное время.

prog9.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

; установка вектора прерывания int8

mov ax,3508h                  ; получение адреса обработчика (вектор прерывания)

int 21h

mov ip8, bx             ; сохранение указателей на программу обработки

mov ax, es

mov cs8, ax

; установка вектора прерывания int9

mov ax,3509h                  ; получение адреса обработчика (вектор прерывания)

int 21h

mov ip9, bx             ; сохранение указателей на программу обработки

mov ax, es

mov cs9, 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 ah, 25h                   ; установка вектора прерывания

mov al, 8h       

int 21h                

pop ds

push ds

mov dx, offset myint9         ; получение адреса обработчика

mov ax, seg myint9     

mov ds, ax       

mov ah, 25h                   ; установка вектора прерывания

mov al, 9h       

int 21h                

pop ds

push ds

mov dx, offset myint60        ; получение адреса обработчика

mov ax, seg myint60    

mov ds, ax       

mov ah, 25h                   ; установка вектора прерывания

mov al, 60h      

int 21h                

pop ds

mov ah,2ch                    ; вызов функции 2Ch

int 21h                      

mov ax,0                     

mov al,ch

mov hour,ax

mov al,cl

mov min,ax

mov al,dh

mov sec,ax

time:                               ; цикл, ограничивающий время работы

cmp klav,1                    ; проверка нажатия клавиши