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

时间:2017-06-02 10:51:34

标签: assembly delay x86-16 dosbox

我正在为装配8086(使用DOSBox)的学校项目工作,我试图将我的程序延迟0.5秒。

我尝试创建一个循环,将当前时间与初始时间进行比较,使用int 21h,函数2Ch和$app->get('/resources/{code:.+}/all', function() { /* ... */ }); 中的百分之一值,但它似乎太慢......

DL

1 个答案:

答案 0 :(得分:4)

我宁愿使用BIOS int 1Ah,它会以任何方式用作int 21h服务的来源,这可能会更简单一些。

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

如果您将重新编程定时器芯片,您可能会获得更高的精度,但不要期望像[数十万]秒在DOS下完全可靠地工作(可能在现代操作系统下模拟)。

关于你当前的代码:dl中的百分之一没有递增1,所以你在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