AVR 组装时钟周期

问题描述 投票:0回答:1

我将计算时间延迟,因此我需要时钟周期数。此代码总共的时钟周期是多少?

.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指令。

assembly avr timedelay
1个回答
0
投票

跳转指令有两件事:

  1. 测试状况
  2. 如果条件为真则跳转到分支。

测试条件需要一个周期。在您的情况下,

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 次只有一个循环
© www.soinside.com 2019 - 2024. All rights reserved.