2017-06-02 190 views
2

我正在为程序集8086中的学校(使用DOSBox)工作,并且我试图将程序延迟0.5秒。延迟程序使用int 21h与ah = 2Ch

我试图创建一个循环的当前时间比较初始时间,使用INT 21H,功能代下与DL的百分之价值,但它似乎是太慢了......

mov ah, 2Ch 
int 21h 
mov al, dl ;hundredths 
mov bx, 0 
wait_loop: 
    one_hun: 
     int 21h 
     cmp al, dl 
     je one_hun 
    mov al, dl 
    inc bx 
    cmp bx, 50 
    jne wait_loop 

回答

4

我宁愿使用BIOS int 1Ah,它以任何方式用作int 21h服务的来源,这可能会更简单一些。 (除非你打算重新编程定时器芯片),这是每秒18.2次,所以要等待半秒钟,你可以等待9(cca.440至494.51ms)或10(cca) 。495到549.45ms)的刻度,精度将被限制在默认的+/- 50ms)。如果你要重新编程定时器芯片,你可能会得到更高的精度,但不要期望在DOS下(可能在现代操作系统下模拟)可以完全可靠地工作[10万秒]。


关于当前的代码:在dl的百分之不是由一个递增,所以你在bx那些18.2Hz周期数计数,而不是百分之一(即你的代码等待〜的2.7s , 对?)。

也不要在类似的代码做je,总是使病情<=>=,因为如果出于某种原因(OS没有运行了一段时间码)错过确切100分之50差异,您将创建循环它将几乎无限地运行(直到它在一次溢出后会意外达到50)。

要做到这一点你的方式,你算算三角洲:

mov ah, 2Ch 
    int 21h 
    mov al, dl ;hundredths 
wait_loop: 
     nop  ; burn the CPU a bit less 
     int 21h 
     sub dl,al ; calculate delta of hundredths (-99..+99) 
     jnc delta_positive 
     add dl,100 ; adjust the delta to be positive 1-99 
delta_positive: 
     cmp dl,50 
     jb wait_loop 
+0

谢谢,问题解决了! – Shelly

+0

他们是如何决定每秒18.2次的?看起来很奇怪。 – fuz

+4

@fuz基本上会为完整的16/32位溢出(65536/18.2 =〜3600 = 1小时)加上初始晶振频率:https://blogs.msdn.microsoft.com/oldnewthing/20041202-00/?p = 37153 – Ped7g