【发布时间】:2010-12-23 22:31:12
【问题描述】:
我正在尝试在 16 位 MASM 程序集 x86 中创建一个睡眠/延迟过程,例如每 500 毫秒在屏幕上打印一个字符。 从我所做的研究来看,似乎有三种方法可以实现这一点 - 我想使用一种使用 CPU 时钟滴答的方法。
请注意,我在 Mac OS X Snow Leopard 上通过 VMWare Fusion 运行 Windows XP - 我不确定这是否会影响任何事情。
有人可以为我指明正确的方向,或者提供一段我可以调整的工作代码吗?谢谢!
我发现的代码应该每秒在屏幕上打印“A”,但不起作用(我还是想使用毫秒)。
TOP:
MOV AH,2C
INT 21
MOV BH,DH ; DH has current second
GETSEC: ; Loops until the current second is not equal to the last, in BH
MOV AH,2C
INT 21
CMP BH,DH ; Here is the comparison to exit the loop and print 'A'
JNE PRINTA
JMP GETSEC
PRINTA:
MOV AH,02
MOV DL,41
INT 21
JMP TOP
编辑:按照 GJ 的建议,这是一个工作程序。就叫它
DELAY PROC
TIMER:
MOV AH, 00H
INT 1AH
CMP DX,WAIT_TIME
JB TIMER
ADD DX,3 ;1-18, where smaller is faster and 18 is close to 1 second
MOV WAIT_TIME,DX
RET
DELAY ENDP
【问题讨论】:
-
您是否在用户空间中运行您的代码?在 Windows 上?
-
是的。如我的帖子所述,我正在通过虚拟机在 Windows 上运行它:)
-
在午夜小心你可能会遇到问题。直接读取 0x0040:0x0070 处的刻度内存位置可能会更好。另请阅读:merlyn.demon.co.uk/pas-time.htm#RDT
-
当定时器的前 16 位滚动到 0 时,您的程序也会失败。
-
任何人都可以发布对此程序的更正吗?我不确定如何修复它。