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

dseg SEGMENT PARA PUBLIC 'DATA'

cnt dw 0h

sec dw 0h

adr8i:

ip8 dw 0h                     ; вектор обработчика

cs8 dw 0h

adr60i:

ip60 dw 0h                    ; вектор обработчика

cs60 dw 0h 

msg db '    Second$'

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

mov al, 8h       

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,0h                    

int 16h

push ds

mov dx, ip8

mov ax, cs8

mov ds, ax

mov ah, 25h

mov al, 8h

int 21h

pop ds

push ds

mov dx, ip60

mov ax, cs60

mov ds, ax

mov ah, 25h

mov al, 60h

int 21h

pop ds

mov ah,4ch                    ; завершение работы программы

int 21h

main  ENDP

myint8 proc FAR                    ; обработчик прерывания

push ax                       ; сохранение контекста

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 ax

jmp dword ptr es:adr8i        ; управление - стандартному обработчику

iret

myint8 ENDP

myint60 proc FAR                    ; обработчик прерывания

push ax                       ; сохранение контекста

push bx

push es

push ds

push di

mov ax, dseg

mov es,ax

mov ax,word ptr es:sec  ; инкрементация счетчика секунд и его сброс

inc ah

cmp ah,10

jne mn10

mov ah,0

inc al

cmp al,10

jne mn10

mov al,0

inc al

mn10:

mov word ptr es:sec,ax

add al,30h

add ah,30h

mov word ptr es:msg+1,ax

mov ax, dseg

mov ds,ax

mov ax,0b800h                 ; цветной дисплей

mov es,ax

lea bx, msg

mov di,7d0h                   ; место отображения сообщения

m1:

mov al,[bx]

cmp al,'$'

je m_ex

mov es:[di],al

inc di

inc bx

mov es:[di],word ptr 15h      ; атрибуты вывода сообщения

inc di

jmp m1

m_ex:

pop di                       

pop ds

pop es

pop bx

pop ax

mov al,20h                    ; снятие заявки на обслуживание (ISR)

out 20h,al

iret

myint60 ENDP

cseg ENDS

END work

Время работы в секундах в центр экрана, используется прямое отображение в видеопамять.

Результаты работы программы:

В центре экрана мы видим надпись “ SS Second” розового цвета на синем фоне, SS – время работы программы в секундах, для окончания работы программы следует нажать любую клавишу. Реализован подсчет до 99 секунд.

2.5. Программа вывода на экран времени работы программы.

Программа построена на алгоритме, указанном в учебном пособии.

Вывод времени в формате: HH:MM:SS.

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