Изучение принципов обработки аппаратных прерываний, страница 4

      ; Get int8 handler adress

      mov ax,3508h           

      int 21h

      mov ipsave_8, bx 

      mov ax, es

      mov cssave_8, ax

      ; Get int60h handler adress

      mov ax,3560h

      int 21h

      mov ipsave_60, bx

      mov ax, es

      mov cssave_60, ax

      push ds

      mov dx, offset int_8

      mov ax, seg int_8

      mov ds, ax       

      ; Set out int8h handler

      mov ah, 25h

      mov al, 8h       

      int 21h                

      pop ds

      push ds

      mov dx, offset int_60

      mov ax, seg int_60     

      mov ds, ax       

      ; Set our int60h handler

      mov ah, 25h

      mov al, 60h      

      int 21h                

      pop ds

      mov ah,0h                   

      ; Working with klav

      int 16h

      push ds

      mov dx, ipsave_8

      mov ax, cssave_8

      mov ds, ax

      ; Restore int8h native handler

      mov ah, 25h

      mov al, 8h

      int 21h

      pop ds

      push ds

      mov dx, ipsave_60

      mov ax, cssave_60

      mov ds, ax

      ; Restore int60h native handler

      mov ah, 25h

      mov al, 60h

      int 21h

      pop ds

      ; Exit

      mov ah,4Ch

      int 21h

main  ENDP

int_8 proc FAR   

      push ax    

      mov ax, dseg

      mov es,ax

      mov ax,word ptr es:cnt 

      inc ax

      cmp ax,18  

      jne m0                 

      int 60h

      mov ax,0

m0:

      mov word ptr es:cnt,ax

      pop ax

      jmp dword ptr es:adr_int8         

      iret

int_8 ENDP

int_60 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

      ; Color Display

      mov ax,0B800h    

      mov es,ax

      lea bx, msg

      ; Where to display

      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 0F0h   

      inc di

      jmp m1

m_ex:

      pop di                      

      pop ds

      pop es

      pop bx

      pop ax

      ; Unset ISR int flag

      mov al,20h       

      out 20h,al

      iret

int_60 ENDP

cseg ENDS

END start


Результатом работы программы будет выведенный по центру экрана счетчик секунд, прошедших с момента запуска программы. Если не нажата ни одна клавиша на клавиатуре, программа досчитает до 99 секунд.

Программа 6. Напишите программу вывода на экран времени работы вашей программы. Для этого в тело основной программы включите цикл, ограничивающий время работы. Функции коррекции времени удобнее реализовать в пользовательском прерывании Int 60h, а функции преобразования в символьный вид и вывод на экран располагайте в теле основной програмы. Окончание цикла можно установить по значению относительного времени работы программы.

itime.asm