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

时间:2022-09-02 18:49:20

;程序用途:利用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

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

运行效果:

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


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