mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Case Anwendung in ASM, Sprungweite


Autor: Nooby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich habe leider ein problem mit der Sprungweite beim breq.
>   cpi prog,0
>   breq prog0_neustart
>   cpi prog, 1
>   breq prog1_neustart
>   cpi prog, 2
>   breq prog2_neustart
>   cpi prog, 3
>   breq prog3_neustart
>   cpi prog, 4
>   breq prog4_neustart
>   cpi prog, 5
>   breq prog5_neustart
>   cpi prog, 6
>   breq prog6_neustart
>   cpi prog, 7
>   breq prog7_neustart
>   cpi prog, 8
>   breq prog8_neustart
>   cpi prog, 9
>   breq prog9_neustart
>   rjmp prog0_neustart; default error prog...
>
> prog0_neustart:
> ; nutzcode
> [...]
> prog1_neustart:
> ; nutzcode
> [...]
> prog2_neustart:
> ; nutzcode
> [...]
> [......]

leider kann ich mit dem  breq prog0_neustart noch zum label springen, 
aber spätestens ab dem  breq prog3_neustart bekomme ich Probleme mit der 
Sprungreichweite. Unter einem Label Zwischensprunglabe_prog0_neustart: 
kann  ich zwar einen rjmp befehl einsetzen, der dann zu prog0_neustart 
springt, aber irgendwie sieht das doof und umständlich aus und erhöht 
nicht unbedingt die übersichtlichkeit. Gibt es einen anderen weg, mach 
ich mir das leben vielleicht unnötig schwer?
für anregungen bin ich gern zu haben, vielen Dank,
Martin

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für aufeinanderfolgende Tests nimmt man besser eine Sprungtabelle.
 cpi prog, 10
 brcc zu_gross
 mov zl, prog
 clr zh
 subi zl, low(-sprungtab)
 sbci zh, high(-sprungtab) 
 ijmp

sprungtab:
 rjmp prog0_neustart
 rjmp prog1_neustart
 rjmp prog2_neustart
 rjmp prog3_neustart
 rjmp prog4_neustart
 rjmp prog5_neustart
 rjmp prog6_neustart
 rjmp prog7_neustart
 rjmp prog8_neustart
 rjmp prog9_neustart

zu_gross:


Peter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    cpi prog,0
    brNE weiter1
    jmp prog0_neustart

weiter1:
    cpi   prog, 1
    brNE  weiter2
    jmp   prog1_neustart

weiter2:
...


was anderes fällt mir grad nicht ein

Autor: Nooby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank für die Antworten, 'ne Sprungtabelle ist wohl das, was ich 
bei mir einbauen werde, um zig labels zu vermeiden.

Super, dass einem hier immer so prompt geholfen wird. Schönen Abend noch

Autor: Nooby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.:
Peter, wie bekommt man diesen schönen weißen Kasten für Codeschnipsel 
hin?
 ... 
 hat leider nicht den gewünschen erfolg gezeigt ;-)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht mit c und /c in [] für C-Code und mit avrasm und /avrasm für 
AVR-ASM-Code...

...

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genial @Peter :)

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Frage hab ich zu der Lösung von Peter noch gefunden. Gibt es einen 
Vorteil, die negative Label adresse abzuziehen und nicht die positive 
drauf zu addieren? das müsst doch genau so funktionieren, oder hab ich 
da was übersehen.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin

> Eine Frage hab ich zu der Lösung von Peter noch gefunden. Gibt es einen
> Vorteil, die negative Label adresse abzuziehen und nicht die positive
> drauf zu addieren? das müsst doch genau so funktionieren, oder hab ich
> da was übersehen.

Das ist ein Trick, weil es keine passenden ADD Befehle im AVR gibt 
(Addieren von Konstanten bzw, addieren von Konstanten mit Carry Flag).
Addieren würde auch gehen, braucht aber auf dem AVR mehr Befehle.

MfG
Falk


Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Wenn man, wie ich jedenfalls, fast immer ein Null-Register braucht/hat 
geht auch:
 .def Null R2


 ldi zl, low(sprungtab)
 ldi zh, high(sprungtab)
 add zl,prog
 adc zl,Null
 ijmp
 .
 .
 .
Peters Variante geht aber immer.

MFG Uwe

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ldi zl, low(sprungtab)
> ldi zh, high(sprungtab)
> add zl,prog
> adc zl,Null

Es macht natürlich mehr Sinn, Null (mit Carry) zu zh zu addieren als zu 
zl...

Duck & wech...

...

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.