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
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
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
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
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 ;-)
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.
@ 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
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.