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


von Nooby (Gast)


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

von Peter D. (peda)


Lesenswert?

Für aufeinanderfolgende Tests nimmt man besser eine Sprungtabelle.
1
 cpi prog, 10
2
 brcc zu_gross
3
 mov zl, prog
4
 clr zh
5
 subi zl, low(-sprungtab)
6
 sbci zh, high(-sprungtab) 
7
 ijmp
8
9
sprungtab:
10
 rjmp prog0_neustart
11
 rjmp prog1_neustart
12
 rjmp prog2_neustart
13
 rjmp prog3_neustart
14
 rjmp prog4_neustart
15
 rjmp prog5_neustart
16
 rjmp prog6_neustart
17
 rjmp prog7_neustart
18
 rjmp prog8_neustart
19
 rjmp prog9_neustart
20
21
zu_gross:


Peter

von Matthias (Gast)


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

von Nooby (Gast)


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

von Nooby (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

...

von Fabian (Gast)


Lesenswert?

Genial @Peter :)

von Martin (Gast)


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.

von Falk (Gast)


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


von Uwe (Gast)


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

von Hannes L. (hannes)


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...

...

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.