Forum: Mikrocontroller und Digitale Elektronik Warum Link Register auf den Stack Pointer pushen Cortex M0


von Henrik G. (Firma: Student) (kaltesblondes)


Lesenswert?

Hallo ich habe eine Frage zum Thema Stack Pointer und Link Register
AVR Cortex M0
also wir sollen die Register ausfüllen und der Code fängt an mit
push {R2, R3, lr} Warum pusht man das Link Register auf den Stack was 
bringt das für vorteile wie verändert sich das Link Register und wann 
genau?
Die subroutine ist doch dort gespeichert ?
Wenn ich auf den Stack Pointer 3 Register lade geht dieser 3 Bytes 
runter richtig?
Also wenn der Stack bei 0x20001000 ist 3 Byte runter geht ist er dann 
auf
0x20001400
Wie kann man das schnell Rechnen ?
Ich bedanke mich bei euch für eure Hilfe.

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Angenommen, es geht um ARM (A32/T32)...

Henrik G. schrieb:
> Warum pusht man das Link Register auf den Stack

Wenn man das LR in der Funktion verändert, z.B. weil man weitere 
Funktionen aufruft, kann man sonst nicht mehr zum Aufrufer zurück 
kehren.

Henrik G. schrieb:
> was
> bringt das für vorteile

Das Programm stürzt bei der Rückkehr nicht ab.

Henrik G. schrieb:
> wie verändert sich das Link Register

Dadurch gar nicht.

Henrik G. schrieb:
> und wann
> genau?

Wenn man es explizit beschreibt z.B. mit "mov lr, ..." oder wenn man 
einen Sprung mit "bl" oder "blx" macht, bei manchen ARM-Prozessoren 
macht der Kern das bei Exceptions auch automatisch.

Henrik G. schrieb:
> Die subroutine ist doch dort gespeichert ?

Nein, die Rücksprungadresse.

Henrik G. schrieb:
> Wenn ich auf den Stack Pointer 3 Register lade geht dieser 3 Bytes
> runter richtig?

Nein, 3 Words, d.h. 3*4 Bytes.

Henrik G. schrieb:
> Also wenn der Stack bei 0x20001000 ist 3 Byte runter geht ist er dann
> auf
> 0x20001400

Wie kommst du denn darauf? 0x20001000 - 3 ist 0x20000FFD. Ist aber wie 
gesagt falsch, der SP ist danach 0x20001000 - 12 = 0x20000FF4.

Henrik G. schrieb:
> Wie kann man das schnell Rechnen ?

Mit einem Taschenrechner.

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.