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

int_60 ENDP

cseg ENDS

END start


Программа выводит счетчик времени, прошедшего с момента запуска, пока пользователь не нажмет клавишу. При этом при нажатии на Esc происходит выход из программы, а при нажатии на любую другую клавишу вызывается стандартный обработчик прерывания от клавиатуры.

Программа 10. Преобразуйте программу так, чтобы на экран выводились часы суточного времени. Для этого в начале основной программы примените вызов функции 2Ch прерывания DOS int 21h.

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

      mov ah,2ch             

      int 21h                     

      mov ax,0                    

      mov al,ch

      mov hour,ax

      mov al,cl

      mov min,ax

      mov al,dh

      mov sec,ax

time:                       

      cmp klav,1             

      je Kl_exit

      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

      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: