Stapelregister

A Stapelregister ist ein Computer zentral Prozessorregister dessen Ziel ist es, einen Überblick zu behalten Rufen Sie Stack an. Auf an Akkumulatorbasierte Architektur Maschine, dies kann ein spezielles Register wie SP auf einem sein Intel x86 Maschine. Auf einem General Registrieren Sie MaschineEs kann sich um ein Register handeln, das durch die Konvention reserviert ist, z. B. auf der PDP-11 oder RISC Maschinen. Einige Designs wie die Daten allgemeine Sonnenfinsternis Hatte kein dediziertes Register, verwendete aber eine reservierte Hardwarespeicheradresse für diese Funktion.

Maschinen vor den späten 1960er Jahren - wie die PDP-8 und HP 2100- haben keine Compiler, die unterstützt wurden Rekursion. Ihre Unterroutine -Anweisungen würden normalerweise den aktuellen Standort in der Sprungadresse speichern und dann den Programmabzüglich auf die festlegen nächste die Anschrift.[1] Dies ist zwar einfacher als die Aufrechterhaltung eines Stapels, da es nur einen Rückgabestandort pro Abschnitt mit dem Unterproutine -Code gibt, kann es nicht ohne erhebliche Anstrengungen des Programmierers eine Rekursion geben.

A Stapelmaschine Hat 2 oder mehr Stack -Register - einer von ihnen verfolgt a Rufen Sie Stack an, die anderen (en) verfolgen andere Stapel(s).

Stapelregister in x86

Im 8086Das Hauptstapelregister heißt Stack Pointer - sp. Das Stack -Segmentregister (SS) wird normalerweise verwendet, um Informationen über die zu speichern Speichersegment das speichert die Rufen Sie Stack an des derzeit ausgeführten Programms. SP Punkte auf den aktuellen Stack Top. Standardmäßig wächst der Stapel im Speicher nach unten, sodass neuere Werte bei niedrigeren Speicheradressen platziert werden. Um einen Wert in den Stapel zu bringen, die DRÜCKEN Der Anweisungen wird verwendet. Einen Wert aus dem Stapel zu streichen, die POP Der Anweisungen wird verwendet.

Beispiel: Angenommen, SS = 1000H und SP = 0xF820. Dies bedeutet, dass der aktuelle Stack Top die physische Adresse 0x1f820 ist (dies ist auf Speichersegmentierung in 8086). Die nächsten beiden Maschinenanweisungen des Programms sind:

DRÜCKEN AXT DRÜCKEN BX 
  • Diese erste Anweisung muss den in AX (16-Bit-Register) gespeicherten Wert in den Stapel verschieben. Dies geschieht durch Subtrahieren eines Werts von 2 (2 Bytes) von sp.
  • Der neue Wert von SP wird 0xF81e. Die CPU kopiert dann den Wert von AX in das Speicherwort, dessen physische Adresse 0x1f81e ist.
  • Wenn "Push BX" ausgeführt wird, wird SP auf 0xF81C gesetzt und BX wird auf 0x1f81c kopiert.[2]

Dies zeigt, wie Push funktioniert. Normalerweise drückt das laufende Programm Register zum Stapel, um die Register für andere Zwecke zu nutzen, um eine Routine zu nennen, die die aktuellen Werte der Register ändern kann. Um die im Stapel gespeicherten Werte wiederherzustellen, muss das Programm maschinelle Anweisungen wie diese enthalten:

POP BX POP AXT 
  • Pop BX Kopiert das Wort bei 0x1f81c (das ist der alte Wert von BX) zu BX und erhöht dann SP um 2. SP ist jetzt 0xF81E.
  • Pop -Axt Kopiert das Wort unter 0x1f81e in AX und setzt SP auf 0xF820.[NB 1][NB 2]

Stapelmotor

Einfachere Prozessoren speichern den Stapelzeiger in einem regulären Hardwareregister und benutze die Arithmetik-Logikeinheit (Alu), um seinen Wert zu manipulieren. Normalerweise werden Push und Pop in mehrere übersetzt Mikrooperationen, um den Stapelzeiger separat hinzuzufügen/subtrahieren und die Lade-/Speichern im Speicher durchführen.[3]

Neuere Prozessoren enthalten eine engagierte Stapelmotor Stapeloperationen optimieren. Pentium m war der erste X86 -Prozessor, der einen Stapelmotor einführte. In seiner Implementierung wird der Stapelzeiger unter zwei Registern aufgeteilt: ESPO, das ist ein 32-Bit-Register und ESPd, ein 8-Bit-Delta-Wert, der direkt von Stack Operations aktualisiert wird. Opcodes drücken, pop, rufen und retieren, arbeiten direkt mit dem ESPd registrieren. Wenn espd ist nahezu Überlauf oder das ESP -Register wird aus anderen Anweisungen verwiesen (wenn ESPd ≠ 0), ein Synchronisations-Mikro-OP wird eingefügt, der das ESP aktualisiertO Verwenden des Alu und zurückgesetzt ESPd bis 0. Dieses Design ist in späteren Intel -Prozessoren weitgehend unmodifiziert, obwohl ESPO wurde auf 64 Bit erweitert.[4]

Ein Stapelmotor ähnlich wie Intel wurde auch in der übernommen AMD K8 Mikroarchitektur. Im BulldozerDie Notwendigkeit von Synchronisationsmikrooperationen wurde entfernt, aber das interne Design des Stapelmotors ist nicht bekannt.[4]

Anmerkungen

  1. ^ Das Programm über Pops BX zuerst, weil es zuletzt gedrückt wurde.
  2. ^ 8086, DRÜCKEN & POP Anweisungen können nur mit 16-Bit-Elementen funktionieren.

Verweise

  1. ^ Salomon, David (Februar 1993) [1992]. Geschrieben an der California State University, Northridge, Kalifornien, USA. Chivers, Ian D. (Hrsg.). Assembler und Lader (PDF). Ellis Horwood -Serie in Computern und ihren Anwendungen (1. Aufl.). Chicester, West Sussex, Großbritannien: Ellis Horwood Limited / Simon & Schuster International Group. ISBN 0-13-052564-2. Archiviert (PDF) vom Original am 2020-03-23. Abgerufen 2008-10-01. Die meisten Computer speichern die Absenderadresse entweder im Stapel, in einem der Register oder im ersten Wort der Prozedur (in diesem Fall sollte die erste ausführbare Anweisung des Prozedur im zweiten Wort gespeichert werden). Wenn die letztere Methode verwendet wird, ist eine Rückgabe aus dem Verfahren ein Sprung zum Speicherort, dessen Adresse im ersten Wort des Prozedur enthalten ist. (xiv+294+4 Seiten)
  2. ^ Howard, Brian. "Montage -Tutorial - Anweisungen". Abteilung für Informatik, Depauw Universität. Abgerufen 2013-07-19.
  3. ^ Stokes, Jon "Hannibal" (2004-02-25). "Ein Blick auf den Centrino -Kern: das Pentium m". archive.arstechnica.com. p. 5.
  4. ^ a b Nebel, Agner. "Die Mikroarchitektur von Intel, AMD und über CPUs" (PDF). Technische Universität Dänemark.