文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发其他语言定时器时间数据转换子程序分析
精品推荐
特别推荐
·控制面板知多少
·给你十条学习Ruby语言的理由
·分页管理机制
·Perl 语言的重要价值体现
·经验技巧:分享两条Delphi开发经验
·Java编程思想:面向对象的逻辑思维方法
·Samba系统简介
热点TOP10
·AIX 5L 学习大纲/简易教程(2)(未经许可,请勿COPY)
·DENX U-Boot及Linux使用手册
·EZ-USB 68013A开发指南
·图象处理中的边缘检测------canny算子
·Visual C++ ADO数据库编程入门
·利用 wordXP 实现自动排班
·UDT协议-基于UDP的可靠数据传输协议
·XPCOM--LINUX下的组件开发技术
·MyEclipse JSF 快速入门中文版(上)
·samba和openldap结合实战
·AIX 5L 学习大纲/简易教程(1)(未经许可,请勿COPY)
·Microsoft Windows XP Embedded 开发工具概述
·eMbedded Visual C++开发入门
·在VC6中创建wxWidgets项目[附图]
·数值计算程序大放送-线性代数方程组
·列表视图控件
·visual studio 2005 简体中文团队开发版 SQL server 2005简体中文版下载
·Visual Studio 2005:在 Visual C++ 中开发自定义的绘图控件
·汇编语言工具下载
·多文档界面(MDI)

定时器时间数据转换子程序分析

日期:2007年5月2日 作者: 查看:[大字体 中字体 小字体]



    进日,我在看一时钟TSR程序,分析其中一个把BIOS数据区中的定时器数据转换成HH:MM:SS时间格式的数据(ASCII)的程序片段时,既学到一点东西,又发现了一写自己弄不明白的问题。现在我把自己学到的好东西写出来与大家分享,同时向各路高手请教请教。
    程序片段如下:(汇编语言程序)
...  (省略)
    HMS  db 8 dup(':')
...
time proc
        lea  di,position             ;(1)  --行号
mov  ax,0                    ;(2)
mov  ds,ax                   ;(3)
mov  al,ds:[46eh]            ;(4)
call clk1                    ;(5)
mov  ax,ds:[46ch]            ;(6)
mov  dx,0                    ;(7)
mov  bx,444h                 ;(8)
call clk0                    ;(9)
mov  ax,dx                   ;(10)
mov  cx,3ch                  ;(11)
mul  cx                      ;(12)

clk0:
        add  di,3                    ;(13)
div  bx                      ;(14)  
clk1:
        aam                          ;(15)
add  ax,3030h                ;(16)
xchg ah,al                   ;(17)
mov  cs:[di],ax              ;(18)
ret                          ;(19)
time endp

    程序片段实现的原理是把BIOS的INT 1CH时钟控制中断在BIOS数据区建立的0040:006CH(低字) 和0040:006EH(高字)单元32位时间数字计数器中的数值用一种比较简明的方式转换成HH:MM:SS时间格式(为ASCII字符),再用另一显示子程序把转换好的字符传显示在屏幕上。
  INT1CH中断每55毫秒发生一次中断,每发出一次中断就把0040:006CH--0040:006EH的32位时间数字计数器中的内容加一,一天24小时,最大的计数值为001800B0H,达到最大值,INT1CH把这个计数器复位为0,然后重新计数,新的一天又开始。
    我搞不明白的是为什么计数器的最大值会是1800B0H(1573040),1573040*55/1000=86517.2(秒)而24小时是86400秒,计数器的值比实际值大。INT1CH每55毫秒中断一次,也就是说1秒钟中断18.1818181818...(无数个18)次,若按每秒中断18.2次的话,一天24小时计数器的数值应为1572480,比1573040少了560(为30.8秒) 。一个小时3600秒中断次数为65520(以18.2计算),比65535(2的16次方为65536)少15次(不足一秒)。一天少360次,与前面少560次又不同。真令我费解。

    现假设一个时间计数器的数值,分析上述程序片段的执行过程。假设[0040:006EH]=0017H,[0040:006EH]=1AA3H。程序片段的执行过程为:
{(1)->(4)}->{(15)->(19)}->{(6)->(8)}->{(13)->(19)}->{(10)->(19)}
(小括号中的数字为行号,大括号中的箭头为顺序指令序列,大括号外的箭头为指令跳转)

    (1)->(3): DS=AX=0,DI=HMS的位移,HMS是用以存储转换后的时间值(ASCII)的内存单元。
    (4):      MOV AL,DS:[46EH]即AL=17H
    (5):      CALL CLK1  ;调用CLK1

    CLK1的执行过程如下: ((15)->(19),此时转换小时值)
    (15):     AAM指令,乘法的ASCII调整指令,把AL中的值调整为非压缩的BCD格式,即把AL除以0AH(10),商放在AH中,余数放在AL中.执行后,AX=0203H.
    (16):     ADD AX,3030H  令AX=3233H,就是2和3的ASCII值.
    (17):     XCHG AH,AL 令AX=3332H.
    (18):     MOV CS:[DI],AX  把转换后的数值(ASCII)存在HMS中.
    (19):     RET 返回.   (返回执行第6条指令)

    此时,HMS为 (高字) ':',':',':',':',':',':','3','2'(低字)

    (6):      MOV AX,DS:[46CH]  AX=1AA3H
    (7),(8):  BX=444H,DX=0
    (9):      CALL CLK0  ;调用CLK0

    CLK0的执行过程如下: ((13)->(19),此时转换分钟值)
    (12):     ADD DI,3  把DI加3,即指向HMS的指针加3.
    (14):     DIV BX    把1AA3H除以444H. 444H=1092,1092/18.2=60(秒).指令执行完后AX=06H(商),DX=10BH(余数)
    (15)...(19):  即执行CLK1,执行过程与以上描述相同,把AX=06H(分钟)转换成能显示的ASCII值.(19)句 RET 返回到第(10)句.

    此时,HMS为(高字) ':',':',':','6','0',':','3','2'(低字)

    开始转换秒数值:

    (10),(11):AX=10BH,CX=3CH.(3CH=60)
    (12):     10BH*3CH=3E94,AX=3E94H
    (13)...(19): 即再次执行CLK0. (14) DIV BX ;3E94H/444H AX=0EH,DX=2DCH.第三次执行CLK1,把AX=0EH(14)转换成可显示的ASCII字符.过程同上.(19) RET 返回调用TIME
子程序处.从(10)到(14) 267*60/1092=267/18.2,(10BH=267)意思是中断267次相当于多少秒.

    最后,HMS为(高字) '4','1',':','6','0',':','3','2'(低字),时间为23:06:14。

    由上可以看出,高字[0040:006EH]为时间值,低字[0040:006CH]为一小时发生中断次数65520次。上述的转换过程已经很清楚了。0040:006EH-0040:006CH中,高字直接调用CLK1转换成可视字符。低字除以444H(次/分)得分钟数值(商),再调用CLK1转换成可视字符。然后把余数(不足一分钟的中断次数)乘3CH,再除以444H,即把余数除以18.2(次/秒)得秒数值(商),最后一次调用CLK1转换成可视字符。所转换得字符存在HMS内存单元中。
    子程序TIME的算法是很易懂的,但INT1CH中断的执行的过程本人还没有不清楚,也没有相应的参考文档,有几个疑问还解不开,特向各位超级大虾(龙虾?)请教。谢谢!


[1] [2] 下一页 




上一篇:话说Java与JavaScript区别

下一篇:对2D游戏引擎设计的一些思考

定时器时间数据转换子程序分析 相关文章:
·MPEG、RM、WMV电影文件格式转换指南
·EasyRecovery 604硬盘数据恢复软件技巧
·3GP手机视频转换工具WinAVI
·性高潮的黄金时间
·校园网网络方案设计及分析
·理想的做爱时间长度是多久
·电脑使用一段时间后会变慢原因解析
·MKV转换成RMVB
·asp.net(C#)海量数据表高效率分页算法(易懂,不使用存储过程)
·如何将DVD影片转换为DVDrip格式?
定时器时间数据转换子程序分析 相关软件:
·MP4/RM转换专家V9.7 Build 4660 白金版
·RM转换精灵V6.3
·性姿势之延长做爱时间法 RMVB 真人示范 性姿势之延长做爱时间法
·3GP转换器 V2.5
·WisMencoder(视频压缩、转换软件)V1.99 正式版
·视频转换大师(WinMPG Video Convert)V6.9.0.0 专业版
·ACCESS数据库教程 北京大学的ACCESS教程
·爆出网站数据库路径
·Video Convert Master(转换,分割,合并视频)V8.0.5.20 汉化版
·Ultra RM Converter(Real文件转换分割,合并)V3.3.0916 汉化版

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:viphot