Rufen Sie Stack an
Im Informatik, a Rufen Sie Stack an ist ein Stapel Datenstruktur Das speichert Informationen über die aktiven Unterroutinen von a Computer Programm. Diese Art von Stapel ist auch als als bekannt Ausführungsstapel, Programmstack, Kontrollstapel, Laufzeitstack, oder Maschinenstapelund wird oft auf gerecht verkürzt "der Stapel". Die Wartung des Anrufstacks ist zwar wichtig für die ordnungsgemäße Funktionsweise der meisten SoftwareDie Details sind normalerweise versteckt und automatisch in hochrangige Programmiersprachen. Viele Computer Anweisungssätze Geben Sie spezielle Anweisungen zum Manipulieren von Stapeln an.
Ein Anrufstack wird für mehrere verwandte Zwecke verwendet, aber der Hauptgrund für einen Grund ist, den Punkt zu verfolgen, an den jede aktive Unterroutine beim Abschluss der Ausführung die Kontrolle zurückgeben sollte. Eine aktive Unterroutine ist eine, die aufgerufen wurde, aber noch nicht auszuführen ist, wonach die Kontrolle bis zur Anlaufstelle zurückgegeben werden sollte. Solche Aktivierungen von Unterroutinen können auf eine beliebige Ebene (rekursiv als Sonderfall) verschachtelt sein, daher die Stapelstruktur. Zum Beispiel, wenn eine Unterroutine Drawsquare
Ruft eine Unterroutine an Drawline
von vier verschiedenen Orten, Drawline
Muss wissen, wo er zurückkehren muss, wenn die Ausführung abgeschlossen ist. Um dies zu erreichen, die, die die Anschrift folgt dem Anweisung das springt zu Drawline
, das Absender, wird mit jedem Anruf auf die Oberseite des Anrufstapels gedrückt.
Beschreibung
Da ist der Anrufstack als organisiert als StapelDer Anrufer drückt die Absenderadresse auf den Stapel und die angerufene Unterroutine, wenn sie fertig ist. zieht oder knallt Die Absenderadresse aus dem Anrufstack und überträgt die Steuerung an diese Adresse. Wenn ein angerufener Unterprogramm eine weitere Unterroutine aufruft, wird eine andere Rückgabeadresse auf den Anrufstapel usw. weitergegeben, wobei die Informationsverletzungen nach dem Programm stapeln und stapeln. Wenn der Druck alle für den Anrufstapel zugewiesenen Raum verbraucht, ist ein Fehler, der als a ist Paketüberfluss tritt auf und führt im Allgemeinen das Programm auf Absturz. Das Hinzufügen eines Unterroutineeintrags zum Anrufstapel wird manchmal als "Wicklung" bezeichnet. Umgekehrt ist das Entfernen von Einträgen "Entspannung".
Es gibt normalerweise genau einen Anrufstack mit einem laufenden Programm (oder genauer mit jedem Aufgabe oder Faden von a Prozess), obwohl zusätzliche Stapel erstellt werden können für Signal Handling oder Kooperatives Multitasking (wie mit setContext). Da es in diesem wichtigen Kontext nur einen gibt, kann er als bezeichnet werden das Stack (implizit "der Aufgabe"); jedoch in der Forth Programmiersprache das Datenstapel oder Parameterstapel wird expliziter als der Anrufstack aufgerufen und wird allgemein als als bezeichnet das Stack (siehe unten).
Im hochrangige ProgrammiersprachenDie Einzelheiten des Anrufstapels sind normalerweise dem Programmierer versteckt. Sie erhalten nur Zugriff auf eine Reihe von Funktionen und nicht auf den Speicher auf dem Stapel selbst. Dies ist ein Beispiel für Abstraktion. Die meisten AssemblersprachenAuf der anderen Seite müssen Programmierer an der Manipulation des Stapels einbezogen werden. Die tatsächlichen Details des Stapels in a Programmiersprache abhängig von der Compiler, Betriebssystemund die verfügbaren Befehlssatz.
Funktionen des Anrufstacks
Wie oben erwähnt, ist der Hauptzweck eines Anrufstapels zu Speichern Sie die Absendungsadressen. Wenn eine Unterroutine aufgerufen wird, muss der Standort (Adresse) der Anweisung, an der die Rufroutine später wieder aufgenommen werden kann, irgendwo gespeichert werden. Die Verwendung eines Stacks zum Speichern der Rücksenderadresse hat wichtige Vorteile gegenüber einer Alternative Konventionen anrufen, wie das Speichern der Absenderadresse vor Beginn der angerufenen Unterroutine oder an einem anderen festen Ort. Eine davon ist, dass jede Aufgabe ihren eigenen Stapel haben kann und daher die Unterroutine sein kann Thread-safeDas heißt, kann gleichzeitig für verschiedene Aufgaben aktiv sein, die unterschiedliche Dinge erledigen. Ein weiterer Vorteil ist, dass durch die Bereitstellung Wiedereinzug, Rekursion wird automatisch unterstützt. Wenn sich eine Funktion selbst rekursiv aufruft, muss für jede Aktivierung der Funktion eine Absenderadresse gespeichert werden, damit sie später verwendet werden kann, um aus der Funktionsaktivierung zurückzukehren. Stapelstrukturen bieten diese Funktion automatisch.
Abhängig von der Sprache, dem Betriebssystem und der Maschinenumgebung kann ein Anrufstapel zusätzliche Zwecke erfüllen, einschließlich beispielsweise:
- Lokale Datenspeicherung
- Ein Unterprogramm benötigt häufig Speicherplatz, um die Werte von zu speichern Lokale Variablen, Die Variablen, die nur innerhalb der aktiven Unterroutine bekannt sind und die Werte nach ihrer Rückgabe nicht behalten. Es ist oft zweckmäßig, Platz für diese Verwendung zuzuweisen, indem Sie einfach die Oberseite des Stapels um genug verschieben, um den Raum bereitzustellen. Dies ist sehr schnell im Vergleich zu Dynamische Speicherzuweisung, was das verwendet Haufen Raum. Beachten Sie, dass jede separate Aktivierung eines Unterprogramms einen eigenen Bereich im Stapel für Einheimische erhält.
- Parameterübergang
- Unterroutinen erfordern häufig die Werte für Parameter von dem Code, der sie aufruft, ihnen zur Verfügung gestellt werden, und es ist nicht ungewöhnlich, dass der Platz für diese Parameter im Anrufstapel dargelegt werden kann. Im Allgemeinen, wenn es nur wenige kleine Parameter gibt, Prozessorregister Wird verwendet, um die Werte zu übergeben, aber wenn es mehr Parameter gibt, als auf diese Weise behandelt werden kann, wird Speicherplatz benötigt. Der Call -Stack funktioniert gut als Ort für diese Parameter, zumal jeder Aufruf an eine Unterprogramme, die unterschiedliche Werte für Parameter aufweist, für diese Werte separate Speicherplatz für diese Werte erhalten.
- Bewertungsstapel
- Operanden für arithmetische oder logische Operationen werden am häufigsten in Register eingebaut und dort betrieben. In einigen Situationen können die Operanden jedoch bis zu einer willkürlichen Tiefe gestapelt werden, was bedeutet Verschütten registrieren). Der Stapel solcher Operanden, eher so in einem RPN -Taschenrechner, wird als Bewertungsstapel bezeichnet und kann Platz im Anrufstapel besetzen.
- Zeiger zur aktuellen Instanz
- Etwas objektorientierte Sprachen (z.B., C ++), lagern Sie die Dies Zeiger zusammen mit Funktionsargumenten im Anrufstack beim Aufrufen von Methoden. Das Dies Zeiger zeigt auf die Objekt Beispiel mit der zu aufgerufenen Methode verbunden.
- Unterroutinekontext einschließen
- Einige Programmiersprachen (z. B.,, Pascal und Ada) Unterstützung der Erklärung von verschachtelte Unterprogramme, die auf den Kontext ihrer umschließenden Routinen zugreifen dürfen, d. H. Die Parameter und lokalen Variablen im Rahmen der äußeren Routinen. Eine solche statische Verachtung kann sich wiederholen (eine in einer Funktion deklarierte Funktion, die innerhalb einer Funktion deklariert wird…). Die Implementierung muss ein Mittel liefern, mit dem eine genannte Funktion auf einer bestimmten statischen Verschachtelungsstufe auf den umschließenden Rahmen auf jeder umschließenden Verschachtelebene verweisen kann. In der Regel wird diese Referenz von einem Zeiger auf den Rahmen der zuletzt aktivierten Instanz der beigefügten Funktion implementiert, die als "Downstack -Link" oder "statischer Link" bezeichnet wird, um sie von der "dynamischen Verbindung" zu unterscheiden, die sich auf den unmittelbaren Anrufer bezieht ((unmittelbarer Anrufer die nicht die statische übergeordnete Funktion sein müssen).
- Anstelle einer statischen Verbindung können die Verweise auf die umschließenden statischen Rahmen in eine Reihe von Zeigern gesammelt werden, die als a bekannt sind Anzeige Dies ist indexiert, um einen gewünschten Rahmen zu lokalisieren. Die Tiefe der lexikalischen Verschachtung einer Routine ist eine bekannte Konstante, sodass die Größe der Anzeige einer Routine festgelegt ist. Auch die Anzahl der enthaltenen Bereiche, die zu Traverse enthalten sind, ist bekannt, der Index in das Display ist ebenfalls festgelegt. Normalerweise befindet sich das Display einer Routine in einem eigenen Stapelrahmen, aber die Burroughs B6500 Implementierte ein solches Display in Hardware, das bis zu 32 statische Niststufen unterstützte.
- Die Anzeigeeinträge, die enthaltene Bereiche enthalten, werden aus dem entsprechenden Präfix der Anzeige des Anrufers erhalten. Eine innere Routine, die wiederholt, erzeugt separate Anrufrahmen für jeden Aufruf. In diesem Fall weisen alle statischen Verbindungen der inneren Routine auf denselben äußeren Routinkontext hin.
- Anderer Rückkehrstaat
- Neben der Rückgabeadresse können in einigen Umgebungen andere Maschinen- oder Softwarezustände vorhanden sein, die wiederhergestellt werden müssen, wenn ein Unterprogramm zurückkehrt. Dies kann Dinge wie Privilegien, Ausnahmeinformationen, arithmetische Modi usw. umfassen. Bei Bedarf kann dies im Anrufstapel genauso gespeichert werden, wie es die Absenderadresse ist.
Der typische Anrufstack wird für die Absenderadresse, die Einheimischen und die Parameter verwendet (bekannt als a Rahmen aufrufen). In einigen Umgebungen können dem Anrufstapel mehr oder weniger Funktionen zugewiesen werden. In dem Forth ProgrammierspracheZum Beispiel werden beispielsweise normalerweise nur die Absenderadresse, die Parameter und Indizes der Zählung von Schleifen und möglicherweise lokale Variablen auf dem Anrufstack gespeichert (der in dieser Umgebung das benannt ist Stapel zurückkehren), obwohl Daten dort vorübergehend unter Verwendung eines speziellen Rückgangsabwicklungscodes aufgenommen werden können, solange die Anforderungen von Anrufen und Rückgaben respektiert werden; Parameter werden normalerweise auf separatem Bereich gespeichert Datenstapel oder Parameterstapel, normalerweise genannt das Stapel in der terminologischen Stapel, obwohl es einen Anrufstapel gibt, da normalerweise expliziter zugegriffen wird. Einige Forths haben auch einen dritten Stapel für Schwimmpunkt Parameter.
Struktur
A Rufen Sie Stack an besteht aus Stackrahmen (auch genannt Aktivierungsdatensätze oder Aktivierungsrahmen). Diese sind Maschinenabhängig und Abi-Abhängige Datenstrukturen, die Informationen über den Unterroutine enthalten. Jeder Stapelrahmen entspricht einem Aufruf einer Unterroutine, die noch nicht mit einer Rückkehr gekündigt wurde. Zum Beispiel, wenn eine Unterroutine namens genannt wird Drawline
läuft derzeit, nachdem er von einer Unterroutine aufgerufen wurde Drawsquare
Der obere Teil des Anrufstacks könnte wie im angrenzenden Bild angelegt werden.
Ein solches Diagramm kann in beide Richtungen gezogen werden, solange die Platzierung der Oberseite und so die Richtung des Stapelwachstums verstanden wird. Darüber hinaus unterscheiden sich die Architekturen unabhängig davon, ob Call -Stapel in Richtung höherer Adressen oder auf niedrigere Adressen wachsen. Die Logik des Diagramms ist unabhängig von der Adressauswahl.
Der Stapelrahmen oben im Stapel ist für die derzeit ausführende Routine, die in beliebiger Reihenfolge auf Informationen in seinem Rahmen (z. B. Parameter oder lokale Variablen) zugreifen kann.[1] Der Stapelrahmen enthält normalerweise mindestens die folgenden Elemente (in Druckreihenfolge):
- die Argumente (Parameterwerte), die an die Routine übergeben wurden (falls vorhanden);
- die Rückgabeadresse zurück zum Anrufer der Routine (z. B. in der
Drawline
Stapelrahmen, eine Adresse inDrawsquare
's Code); und - Platz für die lokalen Variablen der Routine (falls vorhanden).
Stapel- und Rahmenzeiger
Wenn sich Stack -Frame -Größen unterscheiden können, z. B. zwischen verschiedenen Funktionen oder zwischen Aufrufe einer bestimmten Funktion Stapelzeiger. Bei der Funktionsrendite wird der Stapelzeiger stattdessen auf die wiederhergestellt RahmenzeigerDer Wert des Stapelzeigers kurz vor der Aufforderung der Funktion. Jeder Stapelrahmen enthält einen Stapelzeiger auf die Oberseite des Rahmens unmittelbar unten. Der Stapelzeiger ist ein veränderliches Register, das zwischen allen Aufrufe geteilt wird. Ein Rahmenzeiger eines bestimmten Aufrufs einer Funktion ist eine Kopie des Stapelzeigers, wie er vor dem Aufrufen der Funktion war.[2]
Die Positionen aller anderen Felder im Rahmen können entweder zum oberen Rahmen als negative Offsets des Stapelzeigers oder relativ zum oberen Rahmen unten definiert werden, als positive Offsets des Rahmenzeigers. Die Position des Rahmenzeigers selbst muss von Natur aus als negativer Versatz des Stapelzeigers definiert werden.
Speichern der Adresse im Rahmen des Anrufers
In den meisten Systemen verfügt ein Stack -Frame über ein Feld, das den vorherigen Wert des Rahmenzeigerregisters enthält. Zum Beispiel der Stapelrahmen von Drawline
würde einen Speicherort haben, der den Rahmenzeigerwert hält, der Drawsquare
Verwendungen (nicht im oben genannten Diagramm gezeigt). Der Wert wird beim Eintritt in die Unterroutine gespeichert und bei der Rückkehr wiederhergestellt. Durch ein solches Feld an einem bekannten Ort im Stack -Frame kann Code auf jeden Frame nacheinander unter dem Rahmen der derzeit ausführenden Routine zugreifen, und ermöglicht die Routine auch, den Rahmenzeiger einfach wieder herzustellen. Anrufer Frame, kurz bevor es zurückkehrt.
Lexikalisch verschachtelte Routinen
Programmiersprachen, die unterstützen verschachtelte Unterprogramme Haben Sie auch ein Feld im Anrufrahmen, das auf den Stapelrahmen der zeigt neueste Aktivierung des Verfahrens, das die Callee am engsten zusammenfasst, d. H. Die unmittelbare Umfang der Callee. Dies wird als eine genannt Zugangslink oder Statische Verbindung (Da es die statische Verschachtelung bei dynamischen und rekursiven Aufrufen verfolgt) und die Routine (sowie alle anderen Routinen, die sie möglicherweise aufrufen kann) auf die lokalen Daten seiner entschlossenen Routinen auf jeder Niststufe liefert. Einige Architekturen, Compiler oder Optimierungsfälle speichern eine Verbindung für jede umschließende Ebene (nicht nur die sofort umschließenden), so dass tief verschachtelte Routinen, die auf flache Daten zugreifen, nicht mehrere Verbindungen durchqueren müssen. Diese Strategie wird oft als "Display" bezeichnet.[3]
Zugriffsverbindungen können optimiert werden, wenn eine innere Funktion in der Kapselung nicht auf eine (nicht konstante) lokale Daten zugreift, wie dies beispielsweise bei reinen Funktionen der Fall ist, die beispielsweise nur über Argumente und Rückgabewerte kommunizieren. Einige historische Computer, wie die Burroughs große Systeme, hatte spezielle "Display -Register", um verschachtelte Funktionen zu unterstützen, während Compiler für die meisten modernen Maschinen (wie das allgegenwärtige x86) nach Bedarf einfach ein paar Wörter auf dem Stapel für die Zeiger reservieren.
Überlappung
Für einige Zwecke kann der Stapelrahmen einer Unterroutine und der seines Anrufers als Überlappung in Betracht gezogen werden, wobei die Überlappung aus dem Bereich besteht, in dem die Parameter vom Anrufer an den Callee übergeben werden. In einigen Umgebungen drückt der Anrufer jedes Argument auf den Stapel und erweitert so seinen Stapelrahmen und ruft dann die Callee auf. In anderen Umgebungen hat der Anrufer einen preallozierten Bereich oben auf seinem Stapelrahmen, um die Argumente zu halten, die er an andere Subroutinen liefert, die er aufruft. Dieser Bereich wird manchmal als als als bezeichnet Ausgangsargumente Bereich oder Callout -Bereich. Nach diesem Ansatz wird die Größe der Fläche vom Compiler als die größte, die von einem als Unterroutine bezeichneten Unterroutine benötigt wird.
Verwenden
Anrufeverarbeitung aufrufen
Normalerweise ist die Call -Stack -Manipulation, die an der Stelle eines Aufrufs an eine Unterroutine benötigt wird, minimal (was gut ist, da es viele Anrufstellen für jede Subroutine geben kann). Die Werte für die tatsächlichen Argumente werden an der Anrufstelle bewertet, da sie spezifisch für den jeweiligen Aufruf sind und entweder auf den Stapel gedrückt oder in Register platziert werden Konvention anrufen. Die tatsächliche Anrufanweisung wie "Zweig und Link" wird dann normalerweise ausgeführt, um die Kontrolle auf den Code des Zielunterroutine zu übertragen.
Unterroutine -Eingabeverarbeitung
In der genannten Unterprogramme wird der erste ausgestellte Code normalerweise als als als bezeichnet Unterroutine -PrologDa es die notwendige Haushalt vor dem Code für die Aussagen der Routine erbringt.
Für die Anweisungsantriebsarchitekturen, bei denen die Anweisung zum Aufrufen eines Unterroutine die Absenderadresse in ein Register einbringt, anstatt sie auf den Stapel zu drücken, speichert der Prolog üblich Unterroutine ruft keine anderen Routinen auf, die den Wert im Register zurücklassen kann. In ähnlicher Weise können die aktuellen Stapelzeiger- und/oder Frame -Zeigerwerte gedrückt werden.
Wenn Rahmenzeiger verwendet werden, setzt der Prolog normalerweise den neuen Wert des Rahmenzeigerregisters aus dem Stapelzeiger. Der Platz auf dem Stapel für lokale Variablen kann dann zugewiesen werden, indem der Stapelzeiger inkrementell geändert wird.
Das Forth Programmiersprache Ermöglicht eine explizite Wicklung des Anrufstapels (dort als "Rückkehrstapel" genannt).
Rückgabeverarbeitung
Wenn eine Unterroutine zurückkehren kann, führt sie einen Epilog aus, der die Schritte des Prologs rückgängig macht. Dadurch werden in der Regel gespeicherte Registerwerte (z. B. den Rahmenzeigerwert) aus dem Stapelrahmen wiederhergestellt, den gesamten Stapelrahmen aus dem Stapel stecken, indem Sie den Stapelzeigerwert ändern, und verzweigen schließlich an die Anweisung unter der Rückgabeadresse. Unter vielen anrufenden Konventionen sind die Gegenstände vom Epilog aus dem Stapel entstanden. In diesem Fall gibt es normalerweise keine weiteren Stapelmanipulationen, die vom Anrufer durchgeführt werden müssen. Bei einigen Anrufkonventionen liegt es jedoch in der Verantwortung des Anrufers, die Argumente nach der Rückkehr aus dem Stapel zu entfernen.
Abwickeln
Durch die Rückkehr aus der aufgerufenen Funktion steckt das obere Frame vom Stapel und hinterlässt möglicherweise einen Rückgabewert. Der allgemeinere Akt des Aufnehmens eines oder mehrere Frames vom Stapel, um die Ausführung an anderer Stelle im Programm wieder aufzunehmen, heißt Stapel entspannt und müssen durchgeführt werden, wenn nicht lokale Kontrollstrukturen verwendet werden Ausnahmebehandlung. In diesem Fall enthält der Stapelrahmen einer Funktion eine oder mehrere Einträge, die Ausnahmebehandler angeben. Wenn eine Ausnahme ausgelöst wird, wird der Stapel abgewickelt, bis ein Handler gefunden wird, der bereit ist, die Art der geworfenen Ausnahme zu verarbeiten (zu fangen).
Einige Sprachen haben andere Kontrollstrukturen, die allgemeine Abwicklung erfordern. Pascal erlaubt eine globale gehe zu Anweisung zur Übertragung der Kontrolle aus einer verschachtelten Funktion und in eine zuvor aufgerufene äußere Funktion. Für diese Operation muss der Stapel abgewickelt werden und so viele Stapelrahmen nach Bedarf entfernt, um den richtigen Kontext für die Übertragung der Steuerung in die Zielanweisung innerhalb der beigefügten äußeren Funktion wiederherzustellen. In ähnlicher Weise hat C das setjmp
und longjmp
Funktionen, die als nicht-lokaler Gotos fungieren. Common Lisp Ermöglicht die Kontrolle darüber, was passiert, wenn der Stapel durch Verwendung des Entspannungsschutz
Spezialbetreiber.
Bei Anwendung a Fortsetzung, Der Stapel ist (logischerweise) abgewickelt und dann mit dem Stapel der Fortsetzung wieder verwundet. Dies ist nicht der einzige Weg, um Kontinuationen umzusetzen. Wenn Sie beispielsweise mehrere explizite Stapel verwenden, kann die Anwendung einer Fortsetzung ihren Stapel einfach aktivieren und einen zu übergebenen Wert wickeln. Das Programmiersprache Schema erlaubt willkürlich Thunks in bestimmten Punkten zum "Abwickeln" oder "Rückspulen" des Kontrollstapels bei der Aufnahme einer Fortsetzung ausgeführt werden.
Inspektion
Der Anrufstack kann manchmal im Rahmen des Programms inspiziert werden. Abhängig davon, wie das Programm geschrieben und kompiliert wird, können die Informationen auf dem Stapel verwendet werden, um Zwischenwerte und Funktionsaufrufspuren zu bestimmen. Dies wurde verwendet, um feinkörnige automatisierte Tests zu generieren,[4] und in Fällen wie Ruby und SmallTalk, um erstklassige Kontinuationen zu implementieren. Als Beispiel die GNU -Debugger (GDB) implementiert die interaktive Inspektion des Anrufstapels eines laufenden, aber pauzierten C -Programms.[5]
Wenn Sie reguläre Zeitproben des Anrufstacks nutzen, kann dies bei der Profilierung der Leistung von Programmen nützlich sein. Wenn der Zeiger eines Unterprogramms auf den Call-Stapel-Stichprobendaten um ein Vielfaches erscheint, ist es wahrscheinlich ein Code-Engpass und sollte auf Leistungsprobleme geprüft werden.
Sicherheit
In einer Sprache mit freien Zeigern oder nicht überprüften Array-Schreibungen (wie in C), das Mischen von Steuerflussdaten, die die Ausführung von Code (die Rückgabeadressen oder die gespeicherten Frame-Zeiger) und einfache Programmdaten (Parameter oder Rückgabeteile) beeinflussen ) In einem Anrufstack ist möglicherweise ein Sicherheitsrisiko, möglicherweise ein Sicherheitsrisiko ausnutzbar durch Stapelpufferüberläufe als die häufigste Art von Pufferüberläufe.
Einer dieser Angriffe besteht darin, einen Puffer mit willkürlichem ausführbarem Code zu füllen und dann denselben oder einen anderen Puffer zu überfließen, um eine Rückgabedresse mit einem Wert zu überschreiben, der direkt auf den ausführbaren Code verweist. Wenn die Funktion zurückgibt, führt der Computer diesen Code aus. Diese Art von Angriff kann leicht blockiert werden W^x. Ähnliche Angriffe können sogar mit aktiviertem Schutz erfolgreich sein, einschließlich der Return-to-libc-Angriff oder die Angriffe von Return-orientierte Programmierung. Es wurden verschiedene Minderungen vorgeschlagen, wie das Speichern von Arrays an einem völlig separaten Ort vom Rückgabestapel, wie dies in der Forth -Programmiersprache der Fall ist.[6]
Siehe auch
Verweise
- ^ Krzyzanowski, Paul (16. Februar 2018). "Stackrahmen". Rutgers University. Archiviert vom Original am 2021-08-28. Abgerufen 19. Dezember, 2021.
- ^ "Den Stapel verstehen". cs.umd.edu. 2003-06-22. Archiviert von das Original Am 2013-02-25. Abgerufen 2014-05-21.
- ^ Alternative Mikroprozessordesign
- ^ McMaster, S.; Memon, A. (2006). Rufen Sie die Stapelabdeckung für die Reduzierung von GUI-Test-Suite an (PDF). 17. Internationales Symposium für Software -Zuverlässigkeitstechnik (Issre '06). S. 33–44. Citeseerx 10.1.1.88.873. doi:10.1109/issre.2006.19. ISBN 0-7695-2684-5.
- ^ "Debugging mit GDB: Untersuchung des Stapels". chemie.fu-berlin.de. 1997-10-17. Abgerufen 2014-12-16.
- ^ Doug Hoyte. "Die Forth -Programmiersprache - warum Sie es lernen sollten".
Weitere Lektüre
- Dijkstra, E. W. (1960). "Rekursive Programmierung". Numerische Mathematik. 2 (1): 312–318. doi:10.1007/bf01386232.
- Wilson, P. R.; Johnstone, M. S.; Neely, M.; Boles, D. (1995). "Dynamische Speicherzuweisung: Eine Umfrage und kritische Überprüfung". Speicherverwaltung. Vorlesungsnotizen in Informatik. Vol. 986. S. 1–116. Citeseerx 10.1.1.47.275. doi:10.1007/3-540-60368-9_19. ISBN 978-3-540-60368-9.
- "2.4. Der Stapel". MCS -4 -Programmierhandbuch für Montagesprachenhandbuch - Programmierhandbuch für Intellek 4 Mikrocomputersysteme (PDF) (Vorläufige Ausgabe). Santa Clara, Kalifornien, USA: Intel Corporation. Dezember 1973. S. 2-7–2-8. MCS-030-1273-1. Archiviert (PDF) vom Original am 2020-03-01. Abgerufen 2020-03-02. (NB. Intel4-Bit-Prozessor 4004 Implementiert eher einen internen Stapel als einen In-Memory-Stapel.)
Externe Links
- Funktionsaufruf- und Frame -Zeigervorgänge in 68000 Archiviert 2010-07-24 bei der Wayback -Maschine
- Das Libunwind -Projekt - Eine plattformunabhängige Abwicklungs-API