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

      mov ax,0b800h          

      mov es,ax

      lea bx,msg             

      mov di,0         

mn1:

      mov al,[bx]

      cmp al,'$'

      je exit

      mov es:[di],al

      inc di

      inc bx

      mov es:[di],word ptr 0F0h

      inc di

      jmp mn1

exit:

      cmp sec,20

      jne time

      mov al,0         

      out 21h,al

      mov ax,0h                   

      int 16h

      push ds

      mov dx, ipsave_8

      mov ax, cssave_8

      mov ds, ax

      mov ah, 25h

      mov al, 8h

      int 21h

      pop ds

      push ds

      mov dx, ipsave_60

      mov ax, cssave_60

      mov ds, ax

      mov ah, 25h

      mov al, 60h

      int 21h

      pop ds

      mov ah,4ch       

      int 21h

main  ENDP

int_8 proc FAR              

      push ax                

      push es                     

      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 es

      pop ax

      mov ax,dseg

      mov es,ax

      jmp dword ptr es:adr_int8   

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


В течение 20 секунд программа не реагирует на действия пользователя, лишь выводит в левом верхнем углу экрана счетчик прошедшего с момента старта времени. Те клавиши, которые пользователь нажимает в процессе выполнения программы, записываются в буфер и после размаскирования клавиатуры поступают на исполнение. В частности, при нажатии на Ctrl+Alt+Delete компьютер перезагрузится.

Программа 8. В основной программе замените функцию 25h прерывания DOS 21h установки вектора прерывания эквивалентной процедурой на ассемблере. Позаботьтесь о том, чтобы во время смены вектора аппаратного прерывания не произошло другое аппаратное прерывание.

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