确定执行 AVR 汇编语言代码需要多少个时钟周期
Determining how many clock cycles AVR assembly language code will take to execute
如果我得到如下所示的汇编代码,我如何确定执行需要多少个时钟周期?
ldi r20, 250
loop: inc r20
brne loop
nop
在datasheet中,所有指令占用16位(1个指令字)。
自己试了一下,答案是14。由于 ldi r20, 250
被调用一次(1 个循环),因此在溢出到零之前循环被调用 6 次(6x2=12 个循环)。最后,nop
需要 1 个周期。总共是 14 个周期。
然而,答案显然是19个周期。谁能告诉我我做错了什么?
您已跳过在每个循环中包含 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
如果我得到如下所示的汇编代码,我如何确定执行需要多少个时钟周期?
ldi r20, 250
loop: inc r20
brne loop
nop
在datasheet中,所有指令占用16位(1个指令字)。
自己试了一下,答案是14。由于 ldi r20, 250
被调用一次(1 个循环),因此在溢出到零之前循环被调用 6 次(6x2=12 个循环)。最后,nop
需要 1 个周期。总共是 14 个周期。
然而,答案显然是19个周期。谁能告诉我我做错了什么?
您已跳过在每个循环中包含 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