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

She*_*lly 2 assembly delay dosbox x86-16

我正在为学校的程序集 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
Run Code Online (Sandbox Code Playgroud)

Ped*_*d7g 5

我宁愿使用 BIOS int 1Ah,它以int 21h任何方式用作该服务的源,这可能更易于使用。

但要注意默认情况下(除非您打算重新编程定时器芯片)这是每秒 18.2 次滴答,所以要等待半秒,您可以等待 9(大约 440 到 494.51 毫秒)或 10(大约 495 到 549.45) ms) 滴答声,精度将被限制为默认值 +-~50ms)。

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


关于您当前的代码: 中的百分之一dl没有增加一,所以您计算bx的是那些 18.2Hz 滴答的数量,而不是百分之一(即您的代码等待 ~2.7s,对吗?)。

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

  • @fuz 基本上是完全 16/32 位溢出(65536/18.2 = ~3600 = 1 小时)加上初始水晶频率:https://blogs.msdn.microsoft.com/oldnewthing/20041202-00/?p=37153 (4认同)