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

      mov ax,dseg

      mov es,ax

      ; Native handler

      jmp dword ptr es:adr_int8

int_8 ENDP

int_60 proc FAR  

      push ax

      push es

      mov ax, dseg

      mov es,ax

      ; Set flag to change time

      mov es:flag,1    

      ; Increment counter

      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

      ; Unset ISR int flag

      mov al,20h 

      out 20h,al

      iret

int_60 ENDP

cseg ENDS

END start


Данная программа в течение двух минут производит вывод времени, прошедшего с момента запуска.

Программа 7. Используя свою программу, замаскируйте доступ к клавиатуре на 20 с. Попробуйте «перезапустить» компьютер с «теплого старта».

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

adr_int8:

      ipsave_8 dw 0h   

      cssave_8 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,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_60  

      mov ax, seg int_60     

      mov ds, ax       

      mov ah, 25h      

      mov al, 60h      

      int 21h                

      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           

      mov word ptr es:msg+7,ax

      mov ax,min             

      div bl                      

      add ax,3030h           

      mov word ptr es:msg+4,ax

      mov ax,hour            

      div bl                      

      add ax,3030h           

      mov word ptr es:msg+1,ax