0

我想在汇编中编写一个延迟循环。它会造成N周期延迟。

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

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

4

1 回答 1

2

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

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

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

这将延迟延迟 * 10个周期。请注意,延迟是字大小的,因此该构造仅限于 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 个周期。但是,它确实接受长字循环计数器。

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

于 2021-03-12T21:40:45.627 回答