利用windows 1ch 提供用户中断 自制时钟 并能正常运行DOS程序

;程序用途:利用windows 1ch 提供用户中断 自制时钟  并能正常运行DOS程序                                     *

;程序作者:湖北师范学院计算机科学与技术学院         0801班         王定桥                                 *
;核心算法:取并保存原中断  建立新中段  读取时间并驻留内存后退出   依次执行原、新中段显示时间   返回中段   *      
;制作时间:2010-10-25             *
;程序版权:代码公开供学习交流使用,但不得全部引用;若要使用,请先仔细理解后自己制作            * 
;附加说明:此程序系操作系统实验的一个实验          * 
;主要参考:IBM-PC汇编语言程序设计    淮海工学院 刘晶亮 微机原理与接口技术系统驻留时间设计     *             *   
;**********************************************************************************************************

codesg segment  ;程序仅用代码段来描述
assume ds:codesg,cs:codesg
main proc far
 start:
 push ds
 sub ax,ax
 push ax
 mov ax,codesg
 mov ds,ax
;---------------------------------取1ch原来的中断向量并保存
 mov al,1ch
 mov ah,35h
 int 21h
 mov oldint, bx
 mov bx, es
 mov oldint+2,bx
;---------------------------------重置1ch中断向量
 mov dx,offset updtime
 mov ax,seg updtime
 mov ds,ax
 mov al,1ch
 mov ah,25h
 int 21h  
;---------------------------------取当前时间并保存
 mov ah,2ch
 int 21h
 mov hour,ch
 mov min,cl
 mov sec ,dh
;---------------------------------程序驻留内存并退出
  mov ah,31h 
       mov al,0 
        mov dx,((prog_len+15)/16)+16 ;计算驻留字节
        int  21h 
main endp
;--------------------------------------------------------新中断部分
updtime  proc near
;---------------------------------先执行原来的中断的内容
 pushf     
 call dword ptr cs:oldint
;---------------------------------开始执行新添加的内容
 push ax  ;---------- 保护寄存器          
 push bx
 push cx
 push dx
;---------------------------------利用ds寄存器指明保存的数据的地址
 mov ax,codesg
 mov ds,ax
;---------------------------------处理时间的显示和进位部分
 dec count
 jnz exit ;时间未到一秒钟不用进位,继续中断
 add sec,1  ;----------处理秒
 cmp sec,60
 jnz docnt  ;时间未到一分钟不用进位,继续中断
 mov sec,0
 add min,1  ;----------处理分
 cmp min,60
 jnz docnt ;时间未到一小时不用进位,继续中断
 mov min,0
 add hour,1 ;----------处理时
 cmp hour ,24
 jnz docnt ;时间未到24时不用进位,继续中断
 mov hour,0
 docnt:
 mov count,18  ;时间到了一秒时重置计数器
 call timeshow ;仅在1秒到了时更新时间,未到时不更新
 exit:   ;--------------------------返回中断
 pop dx  ;---------- 恢复寄存器
 pop cx
 pop bx
 pop ax
 iret
updtime endp
;--------------------------------------------------------
timeshow proc near  ;---------------根据时间在屏幕显示
;---------------------------------读取当前光标位置并存贮
 xor bh,bh
 mov ah,03h
 int 10h  
 mov cur,dx
;---------------------------------置光标为合适位置
 xor bh,bh
 mov dh,0
 mov dl,71
 mov ah,02
 int 10h
;---------------------------------显示小时
 sub bx,bx
 mov bl,hour
 call bindec ;调用2位十进制数字显示子程序
 call semi   ;调用分号显示子程序
;---------------------------------显示分钟
 sub bx,bx
 mov bl,min
 call bindec 
 call semi   
;---------------------------------显示秒钟
 sub bx,bx
 mov bl,sec
 call bindec
;---------------------------------恢复光标
 xor bh,bh
 mov dx,cur
 mov ah,02h
 int 10h
 ret
 timeshow endp
;--------------------------------------------------------显示2位十进制的数字
bindec proc near
 mov cx,10
 call dec_div ;转化2位十进制数字时先除10求十位
 call curmove
 mov cx,1
 call dec_div  ;转化2位十进制数字时再除1求个位
 call curmove
 ret
bindec endp
;--------------------------------------------------------将2位十进制数字转化为1位十进制数来显示
dec_div proc near
 mov ax,bx
 mov dx,0
 div cx  ;根据cx中内容作除法
 mov bx,dx
 push bx
 add al,30h ;显示商的大小
 xor bh,bh
 mov bl,41h
 mov ah,09h
 mov cx,1
 int 10h
 pop bx  ;将余数保留以便下次计算出个位数字
 ret
dec_div endp
;--------------------------------------------------------显示分号
semi proc near
 mov al,':'
 xor bh,bh
 mov bl,41h
 mov ah,09h
 mov cx,1
 int 10h
 call curmove
 ret 
semi endp
;--------------------------------------------------------带颜色显示字符时移动光标
curmove  proc near
 mov ah,03
 int 10h
 inc dl
 mov ah,02
 int 10h
 ret
curmove endp
;--------------------------------------------------------所要保存和使用的数据
 ;------------保存旧的向量
 oldint  dw   2 dup (?)
 ;------------计时参数
 count  dw  18
 hour  db  0
 min   db  0
 sec   db  0
 ;------------光标参数
 cur     dw      0
 ;----------------
 prog_len equ $-main 
codesg ends
end start

 ***********************************************************************************************

运行效果:


本文对应程序下载地址:http://download.csdn.net/detail/ziyuanxiazai123/2791641

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值