www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik brne - Sprungweite nicht ausreichend


Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

Da ich mich langsam mit Assembler anfreunde ;), bin ich nun auf ein 
Problem gestoßen. Die Sprungweite liegt bei diesen Befehlen bei +-64 
Befehlen.

Wie kann ich es nun lösen, dass ich über mehr Befehle springen kann??
Eine zusätzliche Spungmarke möchte ich nicht einbauen, da es dann 
unübersichtlich wird...

Ich hoffe man kann das lösen
Danke im Voraus
mfg Robert

Autor: .-.-. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
+- 64 Befehle ? sicher ?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eher +-64 ROM-Adressen (Worte). Abhilfe kann man nur schaffen, indem man 
mit dem Branch-Befehl zu einem (r)jmp verzweigt, der nahe genug am 
Branch steht.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja: +-64 stimmt genaugenommen nicht ganz. Es sind +64/-63...

Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal.

Ich hab dazu was gefunden:
  cpi pattern, 0x04
  brne PC+2
  rjmp pattern4

Was macht das PC+2 beim brne genau?

Autor: ReiRaWB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Robert
Du wirst um die zusätzliche Marke nicht rumkommen:

   ...
   brne M1
   ...
   <zu viele Befehlszeilen>
   ...
M1:    ;Sprungweite zu groß

Lösung:

   ...
   breq M2 ;Logikumkehr für kurzen Sprung
   rjmp M1
M2:...
   <zu viele Befehlszeilen>
   ...
M1:    ;Sprungweite reicht aus

Gruß Reinhard

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was macht das PC+2 beim brne genau?
Das ist die zusätzliche Sprungmarke

Autor: MKII User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
statt PC+2 kannst Du auch folgendes schreiben. PC ist der 
Programmcounter
[avrasm]
cpi pattern, 0x04
brne PCplus2_label
rjmp pattern4
PCplus2_label:
...
 [\avrasm]

Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, danke. Was ist der Programm Counter genau?

Edit: Gerade Selbst gefunden. Die Adresse im ROM, die gerade 
abgearbeitet wird.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Solche Konstrukte wie

   brne PC+2

sind etwas gefährlich: Darin ist nämlich die Sprungweite hardcodiert, 
d.h. es kommt (in diesem Fall) auf die Länge des nächsten Befehls an, ob 
der Trick funktioniert, oder nicht.

Wenn der Folgebefehl z.B. 3 Byte lang ist, dann springt der brne PC+2 
mitten in den nächsten Befehl hinein und was dann passiert sieht man 
nicht sofort. Der beste Fall wäre noch, wenn das Programm sofort total 
abstürzt.

Ich würde hardcodierte Sprungweiten nur in Assembler-Macros einsetzten 
und das auch nur, wenn man keine lokale Marken verwenden kann und der 
Assembler zu doof ist, Symbole zu erzeugen, die man als Sprungmarken 
werwenden kann.

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Bubo bubo seinen letzten Absatz etwas erläutern könnte, den 
habe ich nicht verstanden ('Symbole erzeugen als Sprungmarken' ?).

Ich selbst benutze gern und regelmäßig   'go' PC +/- n, und falle 
regelmäßig auf die Nase bei späteren Programmänderungen oder wenn ich 
ein lds oder sts übersehen habe. Bequem fände ich eine Möglichkeit, wie 
sie bei einem Assembler für den HP48 existiert:

    go +
    .
    .
    .
+:  ...

Verzweige vorwärts zum nächsten '+'; '-' entsprechend rückwärts, '++' 
bzw. '--' analog. Gibt es so etwas für AVR?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ('Symbole erzeugen als Sprungmarken' ?)

Richtig tolle Assembler haben einen Symbolgenerator, der bei jedem 
Aufruf einen neuen, noch nicht vorhandenen Namen (= Symbol) erzeugt. Das 
kann man dann z.B. als Namen für Marken verwenden. Man braucht das vor 
allem bei der Macroprogrammierung.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann aber auch seine Programme in kleine sinnvolle Unterfunktionen 
aufteilen.
Z.B. wie hier:

Beitrag "Zeit + Temperatur auf LCD mit AVR"


Dann kommt es meistens garnicht erst zu ellenlangem Spaghetticode, wo 
kreuz und quer gesprungen wird.



Peter

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Verzweige vorwärts zum nächsten '+'; '-' entsprechend rückwärts,
> '++' bzw. '--' analog. Gibt es so etwas für AVR?

Der Gnu-Assembler (auch bei WinAVR mit dabei) unterstützt lokale
Marken. Sie bestehen einfach aus einer Nummer. Bei Verwendung als
Operand in einem Sprungbefehl wird ein 'b' (backward) oder ein 'f'
(forward) an die Nummer angehängt. Der Assembler setzt für den Operand
die Adresse der nächstengelegenen Marke der gewünschten Suchrichtung
mit der entsprechenden Nummer ein. Lokale Marken lassen sich mehrfach
verwenden und eignen sich ideal für kurze Sprünge, bei denen man sich
nicht jedesmal neue Namen ausdenken möchte.

Beispiel:
1:          ; A
   brcs 1f  ; Sprung nach B
   ...
2:          ; C
   ...
   rjmp 1b  ; Sprung nach A
1:          ; B
   rjmp 2b  ; Sprung nach C

  

Autor: senex24 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, yalu !

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.