avr 中的错误 "Relative branch out of reach"

Error "Relative branch out of reach" in avr

我是 AVR 新手。调试时 "brne round_loop" 行出现 "Relative branch out of reach" 错误。有人帮我吗?非常感谢您的帮助。

; Test if round counter has reached 14
mov     t4, rc
subi    t4, 14
brne    round_loop

round_loop:

round_loop:
; XOR state and key
eor     s0, k0
eor     s1, k1
eor     s2, k2
eor     s3, k3

相对分支意味着通过添加或减去一个值来改变程序计数器(当前正在执行的指令)的位置,从而发生跳转。这意味着 brne 中的 round_loop 没有被翻译成绝对地址,而是与当前指令的距离。 brne 的限制是 7 位,所以我相信它应该在 +-64 字以内(每条指令是 1 个字,所以 64 条指令)。所以 round_loop 标签应该在 brne 指令的 64 条指令之内,在它之前或之后。

如果您无法在该范围内移动 round_loop,那么您将不得不对标签执行分支,该标签将执行 JMP 至 round_loop。

AVR BRNE指令是一个16位的操作码,其中7位是分支偏移量。这个 7 位有符号操作数的值 k-64 ≤ k ≤ +63 范围内。 PC 由 k +1 修改(即 -63 到 +64)。如果跳得更远,则相对分支不合适。

您要么需要将目标定位到更靠近分支的位置,要么使用无条件分支到 22 位范围的无条件跳转 (JMP) 或 12 位范围的相对跳转 (RJMP)。

  mov     t4, rc
  subi    t4, 14

  brne    round_loop_longjmp
  rjmp    no_round_jmp
round_loop_longjmp:
  rjmp    round_loop

no_round_jmp:
  ...