【问题标题】:Delay program using int 21h with ah = 2Ch使用 int 21h 和 ah = 2Ch 的延迟程序
【发布时间】:2017-06-02 10:51:34
【问题描述】:

我正在为学校的 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

【问题讨论】:

    标签: assembly delay x86-16 dosbox


    【解决方案1】:

    我宁愿使用 BIOS int 1Ah,它被用作int 21h 服务的源代码,这可能更易于使用。

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

    如果您对定时器芯片进行重新编程,您可能会获得更高的精度,但不要期望像 [10] 万秒这样的东西在 DOS 下可以完美可靠地工作(可能在现代操作系统下模拟)。


    关于您当前的代码:dl 中的百分之一没有增加一,因此您在 bx 中计算那些 18.2Hz 滴答声的数量,而不是百分之一(即您的代码等待约 2.7 秒对吧?)。

    也不要在类似的代码中使用je,始终使条件为<=>=,因为如果出于某种原因(操作系统有一段时间没有运行您的代码)会错过确切的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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多