当前位置: 网学 > 编程文档 > 汇编语言 > 正文

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

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式
sp;;(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   
  • 上一篇资讯: 一个旋转的3D箱子(动画)
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号