错误"相对分支无法到达"在avr

时间:2016-06-17 15:55:23

标签: embedded avr

我是AVR的新手。我有一个"相对分支无法到达" " brne round_loop"调试时排队。有人帮我吗?非常感谢你的帮助。

; 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

2 个答案:

答案 0 :(得分:2)

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

如果你不能在该范围内移动round_loop,那么你必须对一个标签进行分支,这个标签将对round_loop进行JMP。

答案 1 :(得分:2)

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:
  ...