Rücksprung?

OP #537066
Lesenswert?

Hallo, hab ma wieder eine frage!

Folgendes!

cp R30,R16
BRSH LED1grün
cbi PortD.2  ; Hier ist die grüne LED angeschlossen!!!
cp r30,r17

LED1grün:  sbi PORTD.2
           reti

Hier die Frage: Springt der AVR jetzt zurück zu cbi PORTD.2 oder springt 
der jetzt gleich zu cp R30,R17?


Danke!

MFG

Steven
Gast #537077
Lesenswert?

Da springt gar nichts (zumindest nicht definiert), weil es einen Stack 
Underflow gibt...

Ein Unterprogramm wird mit "(r)call" aufgerufen und mit "ret" ("reti" 
nur bei Interrupt Handlern) beendet. Ein Branch-Befehl wie "brsh" 
verzweigt aber nur, ohne dabei eine Rücksprungadresse auf dem Stack 
abzulegen. Deshalb wird beim "ret" (oder "reti") ein Wert vom Stack 
genommen, der gar nicht da ist. Und dann gehts ins Nirvana.

BTW: Welcher Assembler akzeptiert denn die Schreibweise "PortD.2"?
#537079
Lesenswert?

Steven Zimmermann wrote:
> Hallo, hab ma wieder eine frage!
>
> Folgendes!
>
> cp R30,R16
> BRSH LED1grün
> cbi PortD.2  ; Hier ist die grüne LED angeschlossen!!!
> cp r30,r17
>
> LED1grün:  sbi PORTD.2
>            reti
>
> Hier die Frage: Springt der AVR jetzt zurück zu cbi PORTD.2 oder springt
> der jetzt gleich zu cp R30,R17?

Er springr dahin, was in den RAM-Zellen steht, auf die der Stackpointer 
zeigt und verursacht dabei einen Stackunterlauf, der Dein Programm zum 
Absturz bringt.

RETI nimmt man nur für den Rücksprung aus der 
Interrupt-Behandlungsroutine, RET nur nach (R)JMP...

>
>
> Danke!

Nix zu danken, Kundendienst...

>
> MFG
>
> Steven

...
OP #537087
Lesenswert?

Der assembler ist von SiSY,

Aber theoretisch müßte es doch os klappen?

            cp R30,r16
            BRSH LED1grün
            cbi PortD.2
LED1Grün:   sbi PortD.2
            cp r30,r16
            BRSH LED2Blau
             :
             :
             :



der springt doch wenn die bedingung erfüllt ist, nach LED1grün und 
arbeitet dann nach unten weiter oder irre ich mich jetzt?

MFG
#537119
Lesenswert?

Dieter Werner wrote:
> @Hannes
>
>>  RET nur nach (R)JMP...
>
> Bist Du da auch ganz sicher?
>
> Ich würde es nur nach (R)CALL nehmen  ;-))

Stimmt...

Passiert im Gedränge auf'm Frauenklo... 8-o

Ich könnte jetzt zwar schreiben, dass das nur ein kleiner 
Aufmerksamkeitstest war, aber das kauft mir sowiso keiner ab.
Ich könnte meinen Beitrag auch löschen (wird mir noch angeboten), aber 
ich stehe zu dem Unfug, den ich schreibe. Kein Mensch ist fehlerfrei, 
wer weiß, wo ich da gerade mit meinen Gedanken war.

Aber danke für den Hinweis, so bleibt es wenigstens nicht 
unwidersprochen stehen.

Gruß,
Hannes
#537384
Lesenswert?

Steven Zimmermann wrote:

> Aber theoretisch müßte es doch os klappen?
>
>             cp R30,r16
>             BRSH LED1grün
>             cbi PortD.2
> LED1Grün:   sbi PortD.2
>             cp r30,r16
>             BRSH LED2Blau
> der springt doch wenn die Bedingung erfüllt ist, nach LED1grün und
> arbeitet dann nach unten weiter oder irre ich mich jetzt?
>
Soweit OK, allerdings schaltet das Programm die grüne LED auch ein, wenn 
das erste BRSH nicht erfüllt ist!

Nach dem cbi PortD.2 fehlt ein rjmp:
             cp R30,r16
             BRSH LED1grün
             cbi PortD.2
             rjmp testBlau   ; <-----
LED1grün:    sbi PortD.2
testBlau:
             cp r30,r16
             BRSH LED2Blau


Dann noch auf die GROß kleinschreibung achten (OK, nicht bei allen 
Compilern relevant, bei manchen aber doch, Umlaute wuerde ich auch 
weglassen)

LED1grün != LED1Grün

Viel Spaß,
Klaus

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