如果为我提供了如下所示的汇编代码,我如何确定执行几个时钟周期?
ldi r20, 250
loop: inc r20
brne loop
nop
在数据表中,所有指令占用16位(1个指令字)。
我自己尝试,答案为14。由于ldi r20, 250
被调用一次(1个周期),因此该循环被调用6次,然后溢出到零(6x2 = 12个周期)。最后,nop
需要1个周期。总共是14个循环。
但是,答案显然是19个循环。谁能告诉我我做错了什么?
答案 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