Embedded “错误”;“相对分支超出范围”;在avr中

Embedded “错误”;“相对分支超出范围”;在avr中,embedded,avr,Embedded,Avr,我是AVR的新手。调试时,“brne round_loop”行出现“相对分支超出范围”错误。有人帮我吗?非常感谢你的帮助 ; Test if round counter has reached 14 mov t4, rc subi t4, 14 brne round_loop 圆形循环: round_loop: ; XOR state and key eor s0, k0 eor s1, k1 eor s2, k2 eor s3, k3 相

我是AVR的新手。调试时,“brne round_loop”行出现“相对分支超出范围”错误。有人帮我吗?非常感谢你的帮助

; Test if round counter has reached 14
mov     t4, rc
subi    t4, 14
brne    round_loop
圆形循环:

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

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


如果不能在该范围内循环,则必须对标签执行分支,以执行JMP循环。

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

如果无法在该范围内进行循环,则必须对标签执行分支,以执行JMP循环。

AVR指令是一个16位操作码,其中7位是分支偏移量。此7位有符号操作数的值k可以在-64范围内≤ K≤ +63PC由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:
  ...
AVR指令是一个16位操作码,其中7位是分支偏移量。此7位有符号操作数的值k可以在-64范围内≤ K≤ +63PC由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:
  ...

可能是调试器出于自己的目的插入了额外的代码,将以前在范围内的分支移出了范围;具有16位或22位地址操作数(例如JMP)的指令是两个字。也是一个小问题,;7位有符号操作数的范围是-64到+63,而不是+/-64,当条件为真时,BRNE执行PC=PC+k+1操作,跳转范围是-63到+64。可能是调试器出于自身目的插入了额外代码,将以前在范围内的分支移出了范围。回答得好,但是请注意,单词的数量不一定等于指令的数量;具有16位或22位地址操作数(例如JMP)的指令是两个字。也是一个小问题,;7位有符号操作数的范围是-64到+63,而不是+/-64,当条件为真时,BRNE执行PC=PC+k+1的操作。跳转范围是-63到+64。您真的是在“调试时”还是在为调试而构建时?汇编程序不可能生成带有超出范围偏移量的BRNE操作码。您真的是在“调试”时生成的,还是在为调试而生成时生成的?汇编程序不可能生成带有超出范围偏移量的BRNE操作码。