我是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
答案 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:
...