Assembly 这个功能需要多长时间?

Assembly 这个功能需要多长时间?,assembly,delay,atmega,atmel,Assembly,Delay,Atmega,Atmel,我试图计算出这个汇编函数在Atmel ATmega162上需要多长时间。最初的代码注释和命名建议它应该产生10µs的延迟,但我对此表示怀疑。不幸的是,我对汇编代码缺乏经验,所以我不确定我的假设是否正确 代码如下: Timer_Loop_10us: push Counter ldi Counter,5 timer_wait10us: nop dec Counter tst Counter brne timer_wait10us pop Counter ret 根据ATmega规范,ldi、

我试图计算出这个汇编函数在Atmel ATmega162上需要多长时间。最初的代码注释和命名建议它应该产生10µs的延迟,但我对此表示怀疑。不幸的是,我对汇编代码缺乏经验,所以我不确定我的假设是否正确

代码如下:

Timer_Loop_10us:

push Counter

ldi Counter,5
timer_wait10us:
nop
dec Counter
tst Counter
brne timer_wait10us

pop Counter
ret
根据ATmega规范,ldi、nop、dec和tst采用1个时钟周期。推送和弹出需要2个周期,ret需要4个周期,brne需要1或2个周期。我假设计数器=0时需要1个周期,计数器=0时需要2个周期0,因为需要跳回标签,但我对此不确定

如果我是正确的,整个函数需要33个时钟周期。ATmega162的CPU速度为16 MHz,这意味着该功能只会产生2µs的延迟,而不是10µs的延迟


我是对的还是我错过了什么?

多亏了Martin Rosenau的评论,我想我已经理解了这个问题

实际上,在我的设备上,时钟频率不是16兆赫,而是3.6864兆赫。同时,还需要考虑调用函数。与返回函数一样,它需要执行4个周期。因此,我们没有33个时钟周期,而是37个时钟周期,速度为3.6864 MHz,这相当准确地为操作生成10µs


谢谢你的帮助

大多数CPU(不是全部)可以与较慢的时钟一起使用。您确定代码是为16 MHz时钟编写的,而不是为4 MHz时钟编写的吗?老实说,我不确定,但即使这样,“调用”指令也需要8µs,而不是10…多少个周期?调用函数时,“call”指令所需的周期(或在AVR上如何命名)也是延迟的一部分…您是对的,这是缺少的部分。非常欢迎你把这个问题写进一个答案中,我可以投赞成票,并将其标记为正确。