我怎样才能减少延迟?

时间:2010-11-26 11:02:06

标签: assembly delay

我想在程序集中创建一个减少延迟的子程序,例如:

  • 第一次将延迟1秒
  • 下次700毫秒
  • 直到0秒

3 个答案:

答案 0 :(得分:0)

写一个延迟子程序,它以延迟值作为参数。然后在调用延迟子程序的循环中,您可以负责减少延迟值。在C中,这可能看起来像这样:

void delay(int t)
{
    // ... code here to generate delay of t ms ...
} 

// ...

for (delay_time = 1000; delay_time >= 0; delay_time -= 300) // delay = 1000, 700, 400, 100 ms
{
    // ... do stuff ...

    if (delay > 0) delay(delay_time);
}

现在您需要做的就是采用这种通用结构,并将其转换为asm,无论您使用何种CPU。

答案 1 :(得分:0)

因为现在我使用这样的东西:

  • mov al,0Ah
  • mov bl,0Ah
  • 开始:
  • dec al
  • cmp al,00h
  • jne start

  • mov al,0Ah

  • dec bl
  • cmp bl,00h
  • jne start

  • HLT

但是这是一个稳定的循环,我希望每次执行都会减少,我知道我必须与外部寄存器/内存进行交互。

答案 2 :(得分:0)

由于不同的CPU以不同的速度运行,你应该使用稍微不同的例程.CPU将计时器保存在内存位置40:6ch,就像randall hyde的书中所写的汇编语言艺术:

  

现在,我们将采取   这个定时器芯片强制CPU增加32位存储器这一事实的优点   位置(40:6ch)每秒约18.2次。通过查看此变量,我们可以确定   CPU的速度并相应地调整空循环的计数值。

     

以下代码的基本思想是观察BIOS计时器变量,直到它为止   变化。一旦改变,就开始通过某种方式计算迭代次数   循环,直到BIOS计时器变量再次更改。注意到迭代次数,   如果执行类似的循环次数相同,则需要大约1 / 18.2秒 -   要执行。

这是Paul R的延迟例程。


然后你可以制作一个类似于你已经使用的程序,但是它会延迟ax(我假设你只使用16位寄存器,对吧?)。尝试使用ah而不是bl,这样你就可以在调用这个程序之前从ax减去0400h:


        mov      ax, ffffh       ; probably you'll need to tune this value

a: ; your printing code
sub ax, 0400h ; and this one too push ax ; it needs to be saved because call delay ; delay resets it pop ax
; ... ...
j?? a main endp
proc delay push bx ; save bx's contents mov bl, al ; and a copy of al l1: dec al ; loop until al > 0
; here you can add some delaying instructions, like scanning ; quite long strings with repne scasb
jnz l1 mov al, bl ; restore al's original value dec ah ; decrease ah jnz l1 ; and loop until > 0 pop bx ret delay endp

如果我理解你的问题,这应该运作良好..