Forum: Mikrocontroller und Digitale Elektronik Skip if Z is cleared


von Nico (Gast)


Lesenswert?

Hallo,

ich würde gerne einen Befehl überspringen, wenn bei der vorigen 
Operation 0 rauskommt. Hier der Codeschnipsel:
1
...
2
cpi  xs, 15        ; vergleiche xs mit 15
3
lds  var3, SREG    ; schreibe SREG in Register var3
4
sbrc  var3, 1      ; überspringe den nächsten Befehl, wenn Z leer ist
5
sbr  var2, 1
6
...
Er überspringt immer den einen Befehl, obwohl xs den Wert 15 hat. Im AVR 
Simulator hab ich dann gesehen, dass er SREG nicht in var3 schreibt. Ist 
das Normal? Wie kann ich das umgehen?

Gruß
Nico

von Spess53 (Gast)


Lesenswert?

Hi

Wie wäre es mit 'breq' nach dem 'cpi'?

MfG Spess

von Nico (Gast)


Lesenswert?

Ja das wäre möglich, aber gibts keine Möglichkeit ohne Sprungmarken?

Gruß
Nico

von Simon K. (simon) Benutzerseite


Lesenswert?

doch
1
breq PC-1

zum Beispiel

von Johannes M. (johnny-m)


Lesenswert?

Dafür gibts doch extra Befehle. Was soll denn der Quatsch, das SREG in 
ein Rechenregister zu laden und dann zu springen? Mach das mit "brbc Z" 
oder "breq" (der springt dann, wenn Z gesetzt ist) nach dem cpi. Dafür 
sind die Branch-Befehle schließlich da.

EDIT: Da war ich wohl zu langsam...

von Gast (Gast)


Lesenswert?

Oder "in var3,SREG" ?

von Nico (Gast)


Lesenswert?

Ach stimmt, das laden muss ja mit "in" gemacht werden und nicht mit 
"lds".
Die Variante mit breq PC-1 gefällt mir ganz gut, nur dass in meinem Fall 
ein breq PC+1 geeignet ist. Ich wollte halt nicht immer ne neue 
Sprungmarke aufschreiben.
Danke für die raschen Antworten!

Gruß
Nico

von Spess53 (Gast)


Lesenswert?

Hi

Was spricht gegen ein Label?

MfG Spess

von Nico (Gast)


Lesenswert?

Ich habe es gerade getestet und für die die es interessiert muss es 
folgendermaßen aussehen:
1
cpi  xs, 15
2
brne  PC+2
3
sbr  var2, 1
Ein PC+1 springt nur bis zum nächsten und nicht zum übernächsten Befehl 
und es muss natürlich in meinem Fall ein brne sein. Auf jedenfall 
funktioniert es jetzt so wie es soll :)

Nochmals Danke,

Gruß
Nico

PS: Ich habe nichts gegen Labels, aber wenn ich diese Anweisung 16 mal 
brauche, dann wollte ich nicht jedes mal ein neues Label hinschreiben. 
So ist es kürzer und ich finde es so übersichtlich genug.

von Peter D. (peda)


Lesenswert?

Nico wrote:

> PS: Ich habe nichts gegen Labels, aber wenn ich diese Anweisung 16 mal
> brauche, dann wollte ich nicht jedes mal ein neues Label hinschreiben.

Wenn ich Programmteile mehr als zweimal brauche, versuche ich sie 
umzuschreiben, z.B. als Schleife oder Tabelle.

Copy&Paste-Monster sind nämlich fehleranfällig, unleserlich, schwer 
wartbar und verbrauchen viel Code.


Peter

von Spess53 (Gast)


Lesenswert?

Hi

Programmteile, die man öfter braucht, sollte man als Unterprogramme 
ausführen. Spart Zeit und Nerven.

MfG Spess

von Peter D. (peda)


Lesenswert?

Spess53 wrote:

> Programmteile, die man öfter braucht, sollte man als Unterprogramme
> ausführen. Spart Zeit und Nerven.

Wenn man sie an verschiedenen Stellen braucht, natürlich.

Ich hatte aber den Eindruck, er meinte 16-mal hintereinander.


Peter

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.