我想在程序集中创建一个减少延迟的子程序,例如:
答案 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)
因为现在我使用这样的东西:
jne start
mov al,0Ah
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
如果我理解你的问题,这应该运作良好..