WEB开发网
开发学院软件开发汇编语言 定时器时间数据转换子程序分析 阅读

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

 2008-04-29 09:34:00 来源:WEB开发网   
核心提示:近日,我在看一时钟TSR程序,定时器时间数据转换子程序分析,分析其中一个把BIOS数据区中的定时器数据转换成HH:MM:SS时间格式的数据(ASCII)的程序片段时,既学到一点东西,程序片段的执行过程为:{(1)->(4)}->{(15)->(19)}->{(6)->(8)}->{(

近日,我在看一时钟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

1 2  下一页

Tags:定时器 时间 数据

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接