Neuling-Frage: Assembler-Befehl "brne" out of range

OP #2665483
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 :)
Angehängte Dateien:
#2665506
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
Persönliche Seite #2665507
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.
Gast #2665508
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.