Case Anwendung in ASM, Sprungweite

Gast #474250
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
#474262
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
Gast #474296
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
Gast #474972
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.
Gast #474975
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

Gast #474984
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

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