定时器时间数据转换子程序分析
2008-04-29 09:34:00 来源:WEB开发网近日,我在看一时钟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
- ››数据库大型应用解决方案总结
- ››数据结构2--数组
- ››数据源架构模式的活动记录
- ››数据结构C#版线性表(Data Structure)之单链表(Lin...
- ››数据结构C#版线性表(Data Structure)之顺序表(顺序...
- ››时间管理不等于事件提醒
- ››数据就是利润:在欧洲两端,IBM Information Cham...
- ››数据架构师: 您要治理什么?
- ››数据驱动的网络营销和网站运营笔记
- ››数据点:Windows Azure 表存储:不同于传统数据库...
- ››数据医生:Alamance Regional Medical Center 通过...
- ››数据显示iPhone 4销售业绩不及Android手机
赞助商链接