我正在使用Assembly 8086编写延迟函数。为此,我正在使用系统时间。首先我重置时间然后循环,直到系统时间等于或大于我想要等待的时间。
这应该不是很困难。 所以这是我的延迟程序:
delay_using_time PROC NEAR
push bp
mov bp, sp
push ax
push bx
push cx
push dx
; Set system time (CH = Hour, CL = minute, DH = second, DL = 1/100 sec)
mov ah, 2Dh
xor cx, cx ; Now CH = 0 = CL
xor dx, dx ; DX = 0 = DH = DL
int 21h
; We check that the reset did not failed
CMP al, 0 ; Als al = 255 dan is het setten van de system time mislukt
JNE exit_delay
mov bl, [bp+4][0] ; We put the argument in BL --> wait time
; Debug --> Prints always 0 (so reset was succesfull)
mov dl, dh
xor dh, dh
push dx
call tprint
; Loop untill DL = wait time, but the problem is DL is immediately bigger
compareTime:
mov ah, 2Ch
int 21h ; #sec in DH, #1/100 sec in DL
; For debug --> I print the number of seconds passed since we reset the time
mov dl, dh
xor dh, dh
push dx
call tprint
; If #seconds < wait time (argument) --> loop again until #seconds >= wait time
CMP dl, bl
JL compareTime
JMP exit_delay
exit_delay:
pop dx
pop cx
pop bx
pop ax
mov sp, bp
pop bp
ret 2
delay_using_time ENDP
但我的延迟程序不起作用。所以我把显示器放入其中以查看问题的来源。
首先我显示重置系统时间后的秒数。它显示0,因此系统时间被正确重置。在循环之后,我显示自重置系统时间以来经过的秒数。当我作为参数3传递时,我希望显示类似1,1,...,1,2,2,...,2,3的东西(所以我想延迟3秒)。 (每个数字都会多次显示,因为它是循环的,并且每秒循环多次)。
但是当我测试我的程序时,我看到每次调用延迟时循环只执行一次! 所以它直接显示例如“54”而不是1,2,3,...,54(我们期望的)。
有人能告诉我为什么会这样吗?我真的不明白,我首先重置系统时间并显示它以确保它被重置然后在循环中我显示秒数。所以秒数从0(当我重置时)立即跳到例如54.
感谢您的帮助!
答案 0 :(得分:0)
昨晚我尝试了你的代码并且它正确执行了。我有成千上万的零,一个和两个以及一个三个 如果函数2Dh的退出值不是0,你的程序有一个明显的方式只运行一次。在真正的DOS下,退出值应该只有0或255.你尝试与255进行比较并跳跃如果相等吗?此外,由于没有正确地重置时间作为调试辅助工具,您可以区分正常退出和退出。也许会发出哔哔声?
此评论并非完全正确
; Debug --> Prints always 0 (so reset was succesfull)
您打印已放入DH寄存器的原稿0! 还
JMP exit_delay
和
mov sp, bp
是多余的。