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

      mov ax, dseg

      mov ds, ax

      ; Get handler int8 adress

      mov ax,3508h

      int 21h

      mov ipsave_8, bx

      mov ax, es

      mov cssave_8, ax

      ; Set our handler int60h

      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 our handler int8

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

      ; Work with klav

      int 16h

      push ds

      mov dx, ipsave_8

      mov ax, cssave_8

      mov ds, ax

      ; Restore int8 handler

      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

      ; 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 ; 1s=18 timer interrupts

      jne m0                 

      int 60h

      mov ax,0

m0:

      mov word ptr es:cnt,ax

      pop ax

      ; Native handler

      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 ds,ax

      ; Color display

      mov ax,0B800h

      mov es,ax

      lea bx, msg

      ; Where to output

      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

      ; Inset int flag (ISR)

      mov al,20h 

      out 20h,al

      iret

int_60 ENDP

cseg ENDS

END start


Результатом выполнения программы является выведенный на экран через 1 секунду после запуска программы символ *.

Программа 5. Замените процедуру вывода в int 60h на подсчет относительного времени с момента начала работы программы.

itimer5.asm


sseg SEGMENT STACK

      db 64 dup (?)

sseg ENDS

dseg SEGMENT PARA PUBLIC 'DATA'

      cnt dw 0h

      sec dw 0h

adr_int8:

      ipsave_8 dw 0h         

      cssave_8 dw 0h

adr_int60:

      ipsave_60 dw 0h  

      cssave_60 dw 0h  

      msg db '    Seconds$'

dseg ENDS

cseg SEGMENT

main proc FAR

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

start:

      ; Inti Data segment

      mov ax, dseg

      mov ds, ax