Forum: Mikrocontroller und Digitale Elektronik Neuling-Frage: Assembler-Befehl "brne" out of range


von Martin L. (mcm)


Angehängte Dateien:

Lesenswert?

Hi,

nach dem ich das Pollin-Board bestellt, gelötet und bereits einige Tests 
damit gemacht habe, ist meine jetztige Spielerei die folgende: ich habe 
mir eine 3x3-LED-Matrix gelötet. Mein Ziel ist es, dass ich mit einer 
Frequenz von 1Hz der Rand und dann die LED2,2 blinkt.

Nunja, dafür habe ich mir ein Assembler-Programm geschrieben, welches 
bedingt durch meine sicherlich nicht sehr effiziente Programmierung ca. 
200 Zeilen hat.

Will ich es nun mit "avra" übersetzen lassen, so wird mir folgender 
Fehler ausgegeben: "3x3.asm(164) : Error   : Branch out of range (-64 <= 
k <= 63)". Der Befehl in Reihe 166 ist "brne".

Ich habe mich bereits ein wenig eingelesen und da sind mir "jmp" und 
"rjmp" begegnet: der Unterschied ist bekanntlich, dass der erste Befehl 
absolut springen kann und der zweite relativ (wahrscheinlich relativ von 
der Position an der dieser sich befindet) springen kann. Es geht also 
sozusagen um Reichweiten, so wie ich das verstanden habe. Und genau das 
ist wohl auch das Problem an brne.

Meine Frage: gibt es eine Art absolutes brne, womit ich von Zeile 166 zu 
Zeile 24 (dort ist das Label "main" - die Sprungadresse) springen kann?

Ich habe einfach mal die Programmdatei mit drangehängt. Vielleicht kann 
man das Problem durch intelligentere Programmierung lösen?

LG und ich hoffe ihr könnt mir mit der sicherlich relativ einfachen 
Frage helfen :)

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

die bedingten Sprünge gibts nur relativ, wenn du durch Optimierung die 
Sprungdistanz nicht verringern kannst musst du den Sprung umbauen.

aus:
1
   ;Bedingung
2
   brne   zuweitweg
3
   ;mach was
4
5
zuweitweg:
6
   ;mach was anderes

wird:
1
   ;Bedingung
2
   breq   m00
3
   rjmp/jmp  zuweitweg
4
m00:
5
   ;mach was
6
7
zuweitweg:
8
   ;mach was anderes

rjmp springt auch schon weiter als die bedingten Sprünge, so das es 
nicht immer unbedingt jmp sein muss.


Sascha

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sprünge können nur einen gewissen Bereich überbrücken, bei den bedingten 
Sprüngen bei AVR lässen die Instruktionen 7-Bit Signed für den 
Sprungoffset zu.

Diese 7 Bits werden verwendet, um Offsets von -64 bis 63 zu codieren. 
Weil AVR-Instruktionen immer Word-aligned sind, kann und wird dieser 
Offset als Word-Offset interpretiert.

Wenn du witer Springen willst, dann zB per (hier GNU Assembler)

BRNE 0f
RJMP .target
0:

anstatt

BREQ .target

Das funktioniert, weil RJMP 13-Bit signed-Offsets zulässt. Falls die 
auch nicht mehr ausreichen, braucht's JMP.

von spess53 (Gast)


Lesenswert?

Hi

>Meine Frage: gibt es eine Art absolutes brne, womit ich von Zeile 166 zu
>Zeile 24 (dort ist das Label "main" - die Sprungadresse) springen kann?

Nein. Aber ersetze einfach
1
  brne main

durch
1
      breq label
2
      (r)jmp main
3
label ...

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.