进日,我在看一时钟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次又不同。真令我费解。
(编辑:aniston)
|