从 3 个嵌套循环计算延迟

Calculating delay from 3 nested loops

我的练习: •计算在 1 MHz 时钟频率下使用三个循环可能的最大延迟。 (回答 49.94 秒)

delay:   ldi    r23,$FF          ;Initialise 3rd loop counter 
loop3:   ldi    r24,$FF          ;Initialise 2nd loop counter 
loop2:   ldi    r25,$FF          ;Initialise 1st loop counter 
loop1:   dec         r25              ;Decrement the 1st loop counter 
          brne   loop1            ;and continue to decrement until 1st loop counter = 0 
          dec    r24               ;Decrement the 2nd loop counter 
          brne   loop2            ;If the 2nd loop counter is not equal to zero repeat the 1st loop, else continue 
          dec    r23
          brne   loop3 
      ret                   ;Return

我正在尝试使用这 3 个循环来计算最大延迟,答案显然是 49.94 秒,我真的很挣扎,使用 2 个嵌套循环要简单得多。

这是我试过的方法,但答案还差得很远。

33*((255*3)-1) + 17*((33*3)-1) + 11*3

ldi - 1 个时钟周期,brne 1 或 2 个时钟周期

架构:ATmega8535

对于初学者来说,最长的循环会加载 0 而不是 FF 到计数器,但让我们坚持使用 FF 以便我们得到预期的答案。使用 FF 循环运行 254 次并在第 255 次退出。

通用公式是 1 for ldi(n-1) * (body + 3) for full iterations (1 for dec and 2 for brne) 和 (body + 2) 用于最后一个(1 用于 dec1 用于未采用 brne)。 body 表示循环体中的任何内容,对于最内层的循环 0 因为它是空的。

因此,对于最内层的循环:1 + 254 * (0 + 3) + (0 + 2) = 765。 对于中间循环,body 是来自最内层循环的 765,因此我们有:1 + 254 * (765 + 3) + (765 + 2) = 195840。 对于最外层的循环,body 是来自中间循环的 195840,因此 我们有:1 + 254 * (195840 + 3) + (195840 + 2) = 49939965 这是预期的答案。