Wozu addl $4, %esp in Unterprogramme

charfi90
Mausschubser
Mausschubser
Beiträge: 61
Registriert: 8. Sep 2010 15:40

Wozu addl $4, %esp in Unterprogramme

Beitrag von charfi90 »

Hallo,

kann mir bitte jemand erklären wozu addl $4, %esp in dem Fakultät Beispiel genutzt wird . braucht man das in allen Unteprogrammen mit Rekursion ?

Gruss

Mirlix_
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 188
Registriert: 3. Mär 2006 14:57

Re: Wozu addl $4, %esp in Unterprogramme

Beitrag von Mirlix_ »

Das entfernt die Rücksprungadresse die von call auf den Stack gepusht wurde. Nach jedem Funktionsaufruf sollte diese vom Stack entfernt werden damit man nicht unnoetig Speicher verliert, adll $4,%esp verschiebt den Stackpoint einfach um 4 Byte nach oben, sodass die Rücksprungadresse beim der nächsten Benutzung von dem Stack überschrieben wird.
"If you want more effective programmers, you will discover that they should not waste their time debugging, they should not introduce the bugs to start with." Edsger W. Dijkstra

simon.r
Mausschubser
Mausschubser
Beiträge: 59
Registriert: 4. Okt 2010 16:13

Re: Wozu addl $4, %esp in Unterprogramme

Beitrag von simon.r »

Ganz so stimmt das nicht, da bei einem Rücksprung mittels "ret" die mit call gesetzte Rücksprungadresse vom Stack in eip gepopt und damit vom Stack "entfernt" wird (Erhöhung von esp). Das "addl $4, %esp" dient dazu den Parameter der Fakultätsfunktion, der vor dem Prozeduraufruf mittels push ebenfalls auf den Stack befördert wurde, zu vergessen. Laut Referenz kann man ret auch angeblich optional die Anzahl an Bytes übergeben, um die der Stackpointer zusätzlich erhöht werden soll.

Mirlix_
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 188
Registriert: 3. Mär 2006 14:57

Re: Wozu addl $4, %esp in Unterprogramme

Beitrag von Mirlix_ »

Ok stimmt, das war etwas ungenau, deine Erklärung ist da eindeutiger.
"If you want more effective programmers, you will discover that they should not waste their time debugging, they should not introduce the bugs to start with." Edsger W. Dijkstra

Antworten

Zurück zu „Archiv“