定时器10s中断

dseg       segment
           count    dw    0
           sec      dw    0
           min      dw    0
           hours    dw    0
dseg       ends
cseg       segment
main       proc     far
           assume   cs:cseg,ds:dseg,es:dseg
start:     push     ds
           sub      ax,ax
           push     ax
           mov      ax,dseg
           mov      ds,ax
           mov      al,1ch;Save old interrupt;
           mov      ah,35h;取中断向量把AL指定的中断类型的中断向量从中断向量表中取到ES:BX中;
           int      21h
           push     es
           push     bx
          
           push     ds
           mov      dx,offset clint
           mov      ax,seg clint
           mov      ds,ax
           mov      al,1ch;中断类型号1CH;
           mov      ah,25h;设置中断向量,把AL指定的中断类型的中断向量DS:DX放在中断向量表中;
           int      21h
           pop      ds
           in       al,21h;中断屏蔽寄存器21H;
           and      al,0feh
           out      21h,al  ;设置中断屏蔽位;
           sti ;设置中断使能位;
          
           mov      cx,60000
mainp:     mov      ax,60000
again:     dec      ax
           jne      again
           loop     mainp    
           pop      dx;将es:bx值弹出到ds:dx中,恢复1CH中断;
           pop      ds
           mov      al,1ch
           mov      ah,25h
           int      21h
           ret
main       endp

clint      proc     near
           push     ds
           push     bx
           mov      bx,seg count
           mov      ds,bx
           lea      bx,count
           inc      word ptr [bx]  ;把位移量为bx的直接寻址方式,把存储器中的一个字加1;
           mov      ax,word ptr [bx]                            
           cmp      word ptr [bx],18;每秒18.2次;大概1s;
           jne      exit
           call     inctest
          
adj:       cmp      hours,12
           jle      timeok;小于或等于转移;
           sub      hours,12
timeok:    mov      ax,sec
           and      ax,0007h;0007&5;0007&15;每隔10s响铃一次;
           cmp      ax,5;每隔
           jne      exit
           mov      dl,07h;the bell ring;响铃;
           mov      ah,2
           int      21h
exit:      mov      al,20h;EOI送中断结束命令给中断命令寄存器;
           out      20h,al
           pop      bx
           pop      ds
           iret
clint      endp

inctest    proc    near
           mov     word ptr[bx], 0
           add     bx,2;时分秒都是字为单位,所以加2个偏移地址;
           inc     word ptr [bx];让秒分时个单元加一;
           cmp     word ptr [bx],60;如果秒分时等于60时,高位加一;如果为60s,那么min加一;
           jne     return
           call    inctest
return:    ret
inctest    endp

cseg       ends
           end     start                      
;IRET 中断返回1,IP,CS和FLAGS出栈;2,返回断点继续执行下一条指令;                               
;INT 3 程序debug调试指令;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值