利用windows 1ch 提供用户中断 自制时钟 并能正常运行DOS程序
2011-03-26 19:14
876 查看
;程序用途:利用windows 1ch 提供用户中断 自制时钟 并能正常运行DOS程序 *
;程序作者:湖北师范学院计算机科学与技术学院 0801班 王定桥 *
;核心算法:取并保存原中断 建立新中段 读取时间并驻留内存后退出 依次执行原、新中段显示时间 返回中段 *
;制作时间:2010-10-25 *
;程序版权:代码公开供学习交流使用,但不得全部引用;若要使用,请先仔细理解后自己制作 *
;附加说明:此程序系操作系统实验的一个实验 *
;主要参考:IBM-PC汇编语言程序设计 淮海工学院 刘晶亮 微机原理与接口技术系统驻留时间设计 * *
;**********************************************************************************************************
***********************************************************************************************
运行效果:
本文对应程序下载地址:http://download.csdn.net/detail/ziyuanxiazai123/2791641
;程序作者:湖北师范学院计算机科学与技术学院 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
相关文章推荐
- 32位&64位版本Windows下运行win32程序扩展用户模式虚拟地址~
- Windows平台使用Python切换用户运行程序
- 在WINDOWS中用户未登录的情况下运行程序的方法
- 用VC2013编译了一个程序,在Windows 8、Windows 7(64位、32位)下都能正常运行。但在Win XP,Win2003下运行时,却报错不能运行
- Windows 7 X64位平台下,VC6调试运行程序,中断调试无法退出
- Windows系统下dos窗口运行程序出现中文乱码
- 利用ShellExecuteEx手动提升用户特权,以管理员权限来运行程序
- Windows 7 X64位平台下,VC6调试运行程序,中断调试无法退出
- bochs利用中断调试dos程序
- 利用Windows自带的Debug程序测试DOS的21#功能调用
- 利用dos控制台编译和运行java程序
- 利用PHP安装windows自动运行的服务,PHP程序可以实现长时间、自动运行、定时更新功能,直接可以用在项目中的类源代码
- [Windows 8小技巧]开启“以其他身份用户运行”程序
- 利用命令行引用外部jar包以使程序正常运行的4种方法
- Windows 7 X64位平台下,VC6调试运行程序,中断调试无法退出
- Windows下利用py2exe生成静默运行的命令行程序
- windows 2003 server开始-运行输入IP访问局域网机子时提示“无任何网络提供程序接受指定的网络路径”
- windows下利用Mingw和msmpi编译运行mpi并行程序
- 利用smba实现windows上写程序,linux上运行
- 让sql2005运行在独立用户下出现 WMI 提供程序错误的解决方式