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

int_8 ENDP

int_60 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             

      out 20h,al

      iret

int_60 ENDP

cseg ENDS

END start


Программа выполняется идентично программе 7.


Программа 9. Исключите цикл, ограничивающий время работы вашей программы. Реализуйте возможность выхода из программы по «горячей клавише». Для этого перехватите аппаратное прерывание от клавиатуры.

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

adr_int8:

      ipsave_8 dw 0h         

      cssave_8 dw 0h

adr_int9:

      ipsave_9 dw 0h         

      cssave_9 dw 0h

adr_int60: 

      ipsave_60 dw 0h        

      cssave_60 dw 0h  

      msg db '   :  :  $'

dseg ENDS

cseg SEGMENT

main proc FAR

      ASSUME      cs:cseg, ds:dseg, ss:sseg

start:

      mov ax, dseg     

      mov ds, ax

      mov ax,3508h           

      int 21h

      mov ipsave_8, bx       

      mov ax, es

      mov cssave_8, ax

      mov ax,3509h           

      int 21h

      mov ipsave_9, bx       

      mov ax, es

      mov cssave_9, ax

      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       

      mov ah, 25h            

      mov al, 8h       

      int 21h                

      pop ds

      push ds

      mov dx, offset int_9   

      mov ax, seg int_9

      mov ds, ax       

      mov ah, 25h            

      mov al, 9h       

      int 21h                

      pop ds

      push ds

      mov dx, offset int_60  

      mov ax, seg int_60     

      mov ds, ax       

      mov ah, 25h            

      mov al, 60h      

      int 21h                

      pop ds

time:                       

      cmp klav,1             

      je Kl_exit

      cmp flag,0             

      je exit

      mov flag,0             

      mov ax,sec