2016-06-17 4 views
0

AVRの新機能です。私はデバッグ中に "brne round_loop"行の "Relative branch of reach"エラーを持っています。私を助ける者は誰ですか?あなたのお役に立ててくれてありがとう。エラーAVRの "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 
+0

あなたは本当に「デバッグ中」の男性ですか、あるいはデバッグ用にビルドしていますか?アセンブラは、到達範囲外のオフセットでBRNE命令コードを生成することはできません。 – Clifford

答えて

2

命令は16ビットのオペコードで、7ビットは分岐オフセットです。この7ビット符号付きオペランドは、kの値を-64≤k≤+63の範囲で持つことができます。 PCはk +1(つまり-63〜+64)で修正されています。ジャンプがそれ以上であれば、相対ブランチは不適切です。

ターゲットをブランチの近くに配置するか、無条件分岐を無条件ジャンプ(JMP)(22ビット範囲)または相対ジャンプ(RJMP)を12ビット範囲で使用する必要があります。

mov  t4, rc 
    subi t4, 14 

    brne round_loop_longjmp 
    rjmp no_round_jmp 
round_loop_longjmp: 
    rjmp round_loop 

no_round_jmp: 
    ... 
2

相対分岐は、ジャンプがそこから値を加算または減算のいずれかによって、プログラム・カウンタ(命令は今実行されている)の位置を変更することによって発生することを意味。つまり、brneのround_loopは絶対アドレスに変換されるのではなく、現在の命令からの距離に変換されます。 brneの制限は7ビットなので、+ 64ワード以内にする必要があります(各命令は1ワードなので64命令です)。したがって、round_loopラベルは、brne命令の前または後の64命令以内になければなりません。

この範囲内でround_loopを移動できない場合は、round_loopへのJMPを行うラベルへの分岐を行う必要があります。

+0

デバッガが独自の目的のために余分なコードを挿入し、以前に範囲内の分岐を範囲外に移動した可能性があります。 –

+0

良い答えですが、ワード数は必ずしも命令数と同じではなく、16ビットまたは22ビットのアドレスオペランド(たとえばJMPなど)の命令は* 2ワード*です。また、マイナーポイント。 7ビット符号付きオペランドの範囲は+/- 64ではなく-64〜+63であり、条件が真である場合、BRNE演算はPC = PC + k + 1を実行し、ジャンプ範囲は-63〜+64です。 – Clifford