【发布时间】:2023-01-16 01:03:39
【问题描述】:
DOS.GetSystemTime function 2Ch 以小时 (CH)、分钟 (CL)、秒 (DH) 和百分之一秒 (DL) 的形式返回当前时间。事实证明,这些“百分之一秒”更像是“二十分之一秒”。
我已经包含了一个连续询问这个 DOS 函数的程序,只显示唯一的时间戳。结果令人失望。如何获得真正的 0.01 秒读数?
ORG 256
Begin:
mov bh, -1
Main:
mov ah, 01h ; BIOS.CheckKeystroke
int 16h ; -> AX ZF
jz Work
mov ah, 00h ; BIOS.GetKeystroke
int 16h ; -> AX
Pause:
mov ah, 00h ; BIOS.GetKeystroke
int 16h ; -> AX
cmp al, 27 ; ESC
jne Work
ret ; TerminateProgram
Work:
call DOSTime ; -> CX DX
cmp bh, dl
je Main ; Hundredths didn't change
mov bh, dl
push dx ; (1)
mov bl, ':'
mov al, ch ; Hours
call PrintTrio ; -> (AX DX)
mov al, cl ; Minutes
call PrintTrio ; -> (AX DX)
pop cx ; (1)
mov bl, '.'
mov al, ch ; Seconds
call PrintTrio ; -> (AX DX)
mov bl, 13
mov al, cl ; Hundredths
call PrintTrio ; -> (AX DX)
mov dl, 10
mov ah, 02h ; DOS.PrintCharacter
int 21h
jmp Main
; ----------------------
; IN (al,bl) OUT () MOD (ax,dx)
PrintTrio:
aam
add ax, '00'
push ax ; (1)
mov dl, ah
mov ah, 02h ; DOS.PrintCharacter
int 21h
pop dx ; (1)
mov ah, 02h ; DOS.PrintCharacter
int 21h
mov dl, bl
mov ah, 02h ; DOS.PrintCharacter
int 21h
ret
; ----------------------
; IN () OUT (cx,dx)
DOSTime:
push ax
mov ah, 2Ch ; DOS.GetSystemTime
int 21h ; -> CX DX
pop ax
ret
; ----------------------
上述程序的典型输出是:
17:15:25.84 17:15:25.89 17:15:25.95 17:15:26.00 17:15:26.06 17:15:26.11 17:15:26.17 17:15:26.22 17:15:26.28 17:15:26.33 17:15:26.39 17:15:26.44 17:15:26.50 17:15:26.55 17:15:26.60 17:15:26.66 17:15:26.71 17:15:26.77 17:15:26.82 17:15:26.88 17:15:26.93 17:15:26.99 17:15:27.04 17:15:27.10这是另一个程序员提出的问题,他想使用 DOS 函数 2Ch 进行延迟,然后发现这个问题不准确:Delay program using int 21h with ah = 2Ch。
【问题讨论】:
标签: assembly time x86 x86-16 dos