68k 汇编中的延迟循环

Delay Loop in 68k Assembly

我想用汇编写一个延迟循环。它将造成 N 个周期的延迟。

我的想法是创建一个 for 循环并迭代 NOP 指令。在这种情况下,我是否必须减少 N 由程序其他部分引起的循环数,例如调用 for 循环?另外,for循环的每次迭代算1次循环还是2次循环?

在最好的情况下 - 有没有人实现过这样的延迟周期?

没有 68k 指令可以在一个周期内执行。即使是一个简单的 NOP 也需要四个周期 - 因此您需要稍微调整一下您的期望。

可以想象的最简单的延迟循环是

       move.w #delay-1,d0
loop:  dbf    d0,loop       ; 10 cycles per loop + 14 cycles for last 
                            ; (branch not taken) 

这将延迟 delay * 10 个循环。请注意,delay 是字大小的,因此该构造仅限于 14 到 655354 个周期之间的延迟。如果你想要更广泛的范围,你需要使用不同的结构,使用长字计数器:

       move.l  #delay,d0
       moveq.l #1,d1
 loop: sub.l   d1,d0        ; 6 cycles for Dn.l->Dn.l
       bne.s   loop         ; 10 cycles for branch

每次迭代消耗 16 个周期。但是,它确实接受长字循环计数器。

如果你想增加可实现的延迟,你可以考虑嵌套延迟循环或更复杂的指令和循环内的寻址方式。然而,这两个是最短的可能延迟循环。