确定要执行多少个AVR汇编语言代码

时间:2019-07-02 02:46:10

标签: assembly avr

如果为我提供了如下所示的汇编代码,我如何确定执行几个时钟周期?

      ldi r20, 250
loop: inc r20
      brne loop
      nop

在数据表中,所有指令占用16位(1个指令字)。

我自己尝试,答案为14。由于ldi r20, 250被调用一次(1个周期),因此该循环被调用6次,然后溢出到零(6x2 = 12个周期)。最后,nop需要1个周期。总共是14个循环。

但是,答案显然是19个循环。谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:3)

您已跳过每个循环中的inc。因此,每个循环将为brne (2) + inc (1)。因此,您的计算应为(括号内的{r20值):

1
1 (251)
2
1 (252)
2
1 (253)
2
1 (254)
2
1 (255)
2
1 (0)
1
1

不采用分支时,brne为1个周期。

如果您展开该循环,它会更加可见:

; (4 cycles)
ldi r20, 250 ; 1
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (3 cycles)
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (3 cycles)
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (3 cycles)
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (3 cycles)
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (2 cycles)
inc r20      ; 1
nop          ; this represents the brne at 1 cycle, because its just overflowed and therefore ** will not branch **

; (1 cycle)
nop