我想在汇编中编写一个延迟循环。它会造成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)
这将延迟延迟 * 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 个周期。但是,它确实接受长字循环计数器。
如果您想增加可实现的延迟,您可以考虑嵌套延迟循环或更复杂的指令和循环内的寻址模式。然而,这两个是最短的可能延迟循环。