brne - Sprungweite nicht ausreichend

OP Persönliche Seite #553084
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
Gast #553104
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
#553137
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.
Gast #553238
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?
#553249
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.
Gast #553276
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
1:          ; A
2
   brcs 1f  ; Sprung nach B
3
   ...
4
2:          ; C
5
   ...
6
   rjmp 1b  ; Sprung nach A
7
1:          ; B
8
   rjmp 2b  ; Sprung nach C

  

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren