我想在汇编中写一个延迟循环。应产生N周期的延迟。我的想法是创建一个for循环并迭代NOP指令。在这种情况下,我是否必须减少N,减少程序的其他部分(例如调用for循环)导致的周期数?此外,for循环的每次迭代算为1个循环还是2个循环?在最好的情况下-有人有这样一个延迟周期的实现吗?
N
NOP
ipakzgxi1#
没有68 k指令会在一个周期内执行。即使是一个简单的NOP也需要四个周期-所以你需要稍微调整一下你的期望。最简单的延迟回路是
move.w #delay-1,d0 loop: dbf d0,loop ; 10 cycles per loop + 14 cycles for last ; (branch not taken)
这将延迟 * 延迟 * 10* 周期数。注意,delay 是字大小的,因此该结构被限制为14到65534个周期之间的延迟。如果你想要一个更大的范围,你需要使用一个使用长字计数器的不同结构:
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个循环。但是,它接受长字循环计数器。如果你想增加可实现的延迟,你可以考虑嵌套的延迟lops或更复杂的指令和循环内的寻址模式。然而,这两个是最短的可能延迟环路。
1条答案
按热度按时间ipakzgxi1#
没有68 k指令会在一个周期内执行。即使是一个简单的NOP也需要四个周期-所以你需要稍微调整一下你的期望。
最简单的延迟回路是
这将延迟 * 延迟 * 10* 周期数。注意,delay 是字大小的,因此该结构被限制为14到65534个周期之间的延迟。如果你想要一个更大的范围,你需要使用一个使用长字计数器的不同结构:
每次迭代消耗16个循环。但是,它接受长字循环计数器。
如果你想增加可实现的延迟,你可以考虑嵌套的延迟lops或更复杂的指令和循环内的寻址模式。然而,这两个是最短的可能延迟环路。