我正在为装配8086(使用DOSBox)的学校项目工作,我试图将我的程序延迟0.5秒。
我尝试创建一个循环,将当前时间与初始时间进行比较,使用int 21h,函数2Ch和$app->get('/resources/{code:.+}/all', function() { /* ... */ });
中的百分之一值,但它似乎太慢......
DL
答案 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