我将计算时间延迟,因此我需要时钟周期数。此代码总共的时钟周期是多少?
.ORG 0
LDI R20, 200 ; Load immediate value 200 into register R20
BACK:
LDI R25, 120 ; Load immediate value 120 into register R25
NOP ; No operation
NOP ; No operation
NOP ; No operation
HERE:
DEC R25 ; Decrement R25
BRNE HERE ; Branch to HERE if R25 is not zero
DEC R20 ; Decrement R20
BRNE BACK ; Branch to BACK if R20 is not zero
LDI R22, 0xFF ; Load immediate value 0xFF into register R22
我理解LDI、NOP、DEC指令每次都有1个时钟周期并且取决于它们的循环,但我混淆了BRNE指令。
跳转指令有两件事:
测试条件需要一个周期。在您的情况下,
brne
测试“零标志”。
然后,如果测试为真,则还需要一个周期才能跳转到标签。否则,程序继续执行下一条指令。
AVR 指令集手册中的示例:
eor r27,r27 ; Clear r27
loop: inc r27 ; Increase r27
...
cpi r27,5 ; Compare r27 to 5
brne loop ; Branch if r27<>5
nop ; Loop exit (do nothing)
brne
将需要 2 个循环来进行 5 次第一次迭代,因为 r27
不等于 5,并且当 r27
等于 5 时,第 6 次只有一个循环