使用 int 21h 和 ah = 2Ch 的延迟程序

Delay program using int 21h with ah = 2Ch

我正在为 8086 的学校做一个项目(使用 DOSBox),我试图将我的程序延迟 0.5 秒。

我尝试创建一个循环,将当前时间与初始时间进行比较,使用 int 21h,函数 2Ch 和 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

我宁愿使用 BIOS int 1Ah,它无论如何都被用作 int 21h 服务的来源,而且使用起来可能更简单一些。

但请注意默认情况下(除非您打算重新编程定时器芯片)这是每秒滴答 18.2 次,因此要等待半秒,您可以等待 9(大约 440 到 494.51 毫秒)或 10( cca. 495 to 549.45ms) ticks, 精度会限制在默认的+-~50ms).

如果你重新编程定时器芯片,你可能会得到更高的精度,但不要指望像 [十] 千秒这样的东西在 DOS 下完美可靠地工作(可能在现代下模拟OS).


关于您当前的代码:dl 中的百分之一不递增,因此您在 bx 中计算的是那些 18.2Hz 刻度的数量,而不是百分之一(即您的代码等待 ~2.7s,对吧?)。

也不要在类似的代码中做je,总是使条件<=>=,因为如果出于某种原因(OS没有运行 你的代码一段时间)错过了那个确切的 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