使用 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
我正在为 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