2016-06-17 8 views
0

Ich bin neu auf AVR. Ich habe einen Fehler "Relative Verzweigung außer Reichweite" für die "brne round_loop" -Zeile während des Debuggens. Kann mir jemand helfen? Vielen Dank für Ihre Hilfe.Fehler "Relative Zweig außerhalb der Reichweite" in avr

; 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

Haben Sie wirklich Männer "während des Debuggens", oder eher beim Debuggen? Es ist nicht möglich, dass der Assembler den BRNE-Opcode mit einem Out-of-Reach-Offset erzeugt. – Clifford

Antwort

2

Die AVR BRNE-Anweisung ist ein 16-Bit-Op-Code, von dem 7 Bits der Zweigversatz sind. Dieser vorzeichenbehaftete 7-Bit-Operand kann einen Wert k im Bereich -64 ≤ k ≤ +63 haben. Der PC wird modifiziert durch k +1 (d.h. -63 bis +64). Wenn der Sprung weiter ist, ist eine relative Verzweigung ungeeignet.

Sie müssen entweder das Ziel näher an der Verzweigung suchen oder eine unbedingte Verzweigung zu einem unbedingten Sprung (JMP) mit einem 22-Bit-Bereich oder einen relativen Sprung (RJMP) mit einem 12-Bit-Bereich verwenden.

mov  t4, rc 
    subi t4, 14 

    brne round_loop_longjmp 
    rjmp no_round_jmp 
round_loop_longjmp: 
    rjmp round_loop 

no_round_jmp: 
    ... 
2

Eine relative Verzweigungs bedeutet, dass der Sprung auftritt, indem die Position des Programmzählers ändert (die Instruktion gerade ausgeführt wird), entweder durch Hinzufügen oder einen Wert von ihm subtrahiert . Das heißt, round_loop in brne wird nicht in eine absolute Adresse übersetzt, sondern in eine Entfernung von der aktuellen Anweisung. Das Limit für brne ist 7bits, also glaube ich, dass es innerhalb von + -64 Worten sein sollte (jede Instruktion ist 1 Wort also 64 Instruktionen). Das round_loop-Label sollte also innerhalb von 64 Anweisungen des brne-Befehls liegen, entweder davor oder danach.

Wenn Sie round_loop nicht innerhalb dieses Bereichs verschieben können, müssen Sie eine Verzweigung zu einem Label erstellen, das einen JMP für round_loop ausführt.

+0

Es könnte sein, dass der Debugger zusätzlichen Code für seine eigenen Zwecke eingefügt hat, indem er einen zuvor innerhalb des Bereichs liegenden Zweig außerhalb des Bereichs verschoben hat. –

+0

Gute Antwort, aber beachten Sie, dass die Anzahl der Wörter nicht unbedingt gleich der Anzahl der Anweisungen ist, Anweisungen mit Operanden mit 16 oder 22 Bit Adresse (wie zum Beispiel JMP) sind * zwei Wörter *. Auch ein kleiner Punkt; der Bereich eines vorzeichenbehafteten 7-Bit-Operanden ist -64 bis +63 anstatt +/- 64, und die Operation BRNE führt PC = PC + k + 1, wenn die Bedingung wahr ist, ist der Sprungbereich -63 bis +64. – Clifford