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)
我宁愿使用 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)