DE3726192A1 - Stacksteuerung - Google Patents
StacksteuerungInfo
- Publication number
- DE3726192A1 DE3726192A1 DE19873726192 DE3726192A DE3726192A1 DE 3726192 A1 DE3726192 A1 DE 3726192A1 DE 19873726192 DE19873726192 DE 19873726192 DE 3726192 A DE3726192 A DE 3726192A DE 3726192 A1 DE3726192 A1 DE 3726192A1
- Authority
- DE
- Germany
- Prior art keywords
- stack
- register
- generation
- memory
- registers
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/76—Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data
- G06F7/78—Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data for changing the order of data flow, e.g. matrix transposition or LIFO buffers; Overflow or underflow handling therefor
- G06F7/785—Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data for changing the order of data flow, e.g. matrix transposition or LIFO buffers; Overflow or underflow handling therefor having a sequence of storage locations each being individually accessible for both enqueue and dequeue operations, e.g. using a RAM
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30101—Special purpose registers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/30134—Register stacks; shift registers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/34—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
- G06F9/4484—Executing subprograms
- G06F9/4486—Formation of subprogram jump address
Description
Ein Stack ist eine Datenstruktur, bei der an einem Ende neue Daten
angefügt und wieder entfernt werden können. Stack (dort Laufzeitstacks
genannt) werden bei blockorientierten höheren Programmiersprachen (PL 1,
Pascal, Modula-2 und Ada) dazu benutzt, bei Unterprogrammaufrufen
(mittels Call-Befehl) Parameter zu übergeben und für das augerufene
Unterprogramm eine neue Generation von lokalen Variablen anzulegen,
die an die Generation des Aufrufers anschließt. Eine solche Generation
nennt man auch Stack-Generation (activation record oder stack frame).
Übergebene Parameter können dann von der neuen Generation aus relativ
zu einem Generationszeiger FP (Frame Pointer) auch als lokale Variable
der neuen Stack-Generation adressiert werden.
Vom Call-Befehl werden dazu der alte Befehlszähler PC, der alte
Generationszeiger FP und meist auch das alte Statuswort im Statusregister
SR an die Adresse eines Stackzeigers SP abgespeichert (SP wird dabei
erhöht).
Der Stackzeiger SP weist auf das Ende einer Stack-Generation hin, er
kann von einer neu eingerichteten Generation (mittels Frame-Befehl) um
die Anzahl der von dieser Generation benötigten lokalen Veriablen
vorgesetzt (erhöht) werden. Gegebenenfalls kann auch der
Generationszeiger FP auf den Anfang der übergebenen Parameter
zurückgesetzt (vermindert) werden.
Bei der Rückkehr (mittels Return-Befehl) wird dann der alte Generations-
Zustand wiederhergestellt.
Eine typische Ausführung dieser Vorgänge zeigt Bild 1 a . . 1 d. Der ganze
Stack wird hierfür im Speicher gehalten.
Die Nachteile dabei sind:
- 1) Parameter müssen vom Aufruf in den Speicherstack abgelegt werden und vom Aufgerufenen wieder geholt werden. Also doppelter Speicherverkehr Schreiben/Lesen.
- 2) Im Normalfall müssen viele Register des Aufrufers - vom Aufrufer selbst oder vom Aufgerufenen - auch in den Speicherstack gerettet und nachher wieder eingelesen werden.
Dieser Speicherverkehr stellt eine große Zeitverschwendung dar.
Alternativ zu dieser Methode, aber mit denselben Nachteilen behaftet,
werden unter anderem folgende Variationen einzeln oder in Kombination
angewendet:
- 1) Der Stack wird absteigend adressiert.
- 2) Das Status-Register SR wird bei internen Unterprogrammen nicht abgespeichert.
- 3) Der Generationszeiger FP wird nicht zurückgesetzt; statt dessen werden die übergebenden Parameter mit einem negativen Displacement relativ zu FP adressiert.
- 4) Die Inhalte von SR, PC und FP werden in anderer, beliebiger Reihenfolge abgelegt und wiederholt.
- 5) Der Stackzeiger SP zeigt auf den letzten gültigen Wert anstatt auf die erste noch unbelegte Adresse.
- 6) Die Lokalvariablen und übergebenen Parameter werden nicht relativ zu FP, sondern relativ zu SP adressiert. In diesem Falle kann FP sogar entfallen. Diese Variation hat aber den Nachteil, daß bei einer Veränderung von SP (zur Ablage von Zwischenergebnissen) sich auch die Relativadresse ändert.
- 7) Der Stackzeiger SP wird nicht von einem Frame-Befehl im aufgerufenen Unterprogramm auf den neuen Wert vorgesetzt, sondern noch vom aufgerufenen Unterprogramm auf den vom aufgerufenen Unterprogramm benötigten Wert vorgesetzt. Dieses Verfahren hat aber den schwerwiegenden Nachteil, daß vorcompilierte aufzurufende Unterprogramme nicht ohne Änderung der aufgerufenen Unterprogramme eingebunden werden können, da in dem aufgerufenen Unterprogramm ja nachträglich die Generationslänge für das aufgerufene Unterprogramm abgeändert werden muß.
Folgende Methoden entsprechen ebenfalls dem Stand der Technik und
vermeiden die Nachteile von "Stack im Speicher":
- 1) Der ganze Stack ist in Form von Registern in der CPU, z. B. auf demselben integrierten Schaltkreis, ausgeführt. Diese Methode wird kaum angewandt, da hierbei die maximale Stackgröße durch die - nicht beliebig große - Zahl der Register begrenzt ist. Außerdem sind bei Mehrfach-Betrieb (Multitask) mehrere Stacks nötig, die entweder in den Speicher umgeladen oder ebenfalls in weiteren Register-Bänken gehalten werden müssen.
- 2) Der Stack ist in einem Speicher- und Registerteil aufgeteilt. Nur der
oberste Teil des Stacks, das heißt die aktuelle - oder die aktuellsten -
Stack-Generation(en) wird in Registern gehalten, ältere Generationen
werden im Speicherteil des Stacks gehalten. Wenn beim Anlegen einer
neuen Stack-Generation im Registerteil nicht genügend Platz ist, wird
der Inhalt von Registern der ältesten Register-Stack-Generation in den
Speicher abgelegt. Die Anzahl der abgespeicherten Register ist hierbei
mindestens gleich der Anzahl der für die neue Stack-Generation
zusätzlich benötigten Register. Die Speicheradresse der
abzuspeichernden Register (die oberste unbelegte Adresse des Stacks im
Speicher) wird in einem Speicherzeiger MP gehalten, der beim
Abspeichern hochgezählt wird.
Diese Methode ist im Wesentlichen eine 1 : 1-Übertragung der in Bild 1 a . . 1 d gezeigten Standardmethode, ist aber mit folgenden Nachteilen behaftet: Es müssen drei Worte (SR, PC und FP) von der Länge eines Speicherwortes (z. B. 32 Bit) vom Call-Befehl als Rückkehrinformation in die Stack-Register übertragen und vom Return-Befehl dann wieder in die entsprechenden Sonderregister (SR, PC, FP) rückübertragen werden. Da in der Regel aus Kostengründen (nur eine ALU) nur ein Wort pro Zyklus übertragen wird, sind dafür drei Zyklen nötig.
Bei der Variation nach 6) kann hierbei aber nicht auf FP verzichtet werden, da FP beim Return-Befehl für den Test auf Unterlauf des Registerteils des Stacks benötigt wird.
Außerdem wird bei dieser Lösung ein Stackzeiger benötigt, der mittels zusätzlicher Hardware verwaltet werden muß, obwohl die jeweils aktuelle Stack-Generation wie Register (relativ zu FP) adressiert und behandelt werden kann. Bei einer Register-Register-Architektur ist für die Errechnung von Zwischenwerten (Klammerauflösung bei Formeln sowie Schleifen) eigentlich kein Stack nötig, weil auch Zwischenwerte nicht am Stackende (Top of Stack), sondern in explizit (zur Compile- Zeit) bezeichnete Register abgelegt werden. - 3) Bei einer weiteren Methode wird wie bei 2) der Stack in einen
Speicher- und Registerteil aufgeteilt, die einzelnen Stack-Generationen
sind jedoch von fester Länge. Das heißt, die Anzahl von übergebenen
Parameter und Variablen ist, jeweils für sich, fest vorgegeben,
unabhängig von der tatsächlichen jeweils benötigten Anzahl. Die
Steuerung ist hier extrem einfach, der Generationszeiger FP wird
einfach nur erhöht (bei Call) oder vermindert (bei Return) und braucht
nicht abgespeichert zu werden. Der Stackzeiger SP entfällt ebenfalls.
Der Nachteil dieser an sich eleganten und sehr einfachen Methode liegt in der Verschwendung der knappen Resource Register: Es werden einmal mehr, einmal weniger Register bereitgestellt als benötigt. Im Mittel bleiben ca. 50% der Register unbenutzt. Die Methode wird deshalb im Schrifttum viel diskutiert, aber kaum in der Praxis angewendet.
Methode 2) und 3) scheinen sich gegenseitig auszuschließen, die
vorliegende Erfindung zeigt jedoch einen Weg, wie die Vorteile der
Methoden 2 - variable Länge einer Stack-Generation - und 3 - Einfachheit
und Wegfall des Stackzeigers - ohne deren jeweiligen Nachteile kombiniert
werden können.
Die Erfindung ist durch folgende Merkmale gekennzeichnet:
- a) Bei der hier gewählten Berechnungsart für den Vergleich von FP mit
MP muß FP nur einen Zahlenbereich darstellen können, der der
doppelten Anzahl der Register in dem Registerteil des Stacks
entspricht. Bei einer Registeranzahl von z. B. 64 muß FP also einen
Bereich von 0 . . 127 darstellen können, was einer 7-Bit-Binärzahl
entspricht.
Diese auf 7 Bit verminderte Länge von FP bietet folgende Vorteile: FP selbst kann als Teil des Statuswortes im Status-Register SR untergebracht werden. Vom Call-Befehl kann es deshalb mit SR zusammen abgespeichert und vom Return-Befehl SR zusammen wiedergeholt werden. Dabei wird im Vergleich zur Methode 2) jeweils ein Zyklus und ein ganzes Register zur Speicherung von FP (da FP in SR enthalten ist) eingespart. Dies ermöglicht eine einfache Steuerung und stellt ein Register pro Generation mehr für das Anwendungsprogramm zur Verfügung; gegenüber Methode 2) bedeutet dies eine Einsparung von 33% an verwalteten Registern pro Stack- Generation. Ein weiterer Vorteil der kurzen Länge von FP besteht darin, daß für eine Erhöhung (beim Call-Befehl) oder eine Verminderung (beim Frame-Befehl) das ohnehin vorhandene Register-Adreßrechenwerk benutzt werden kann, während das 32-Bit-Rechenwerk (ALU) parallel dazu gleichzeitig ein 32-Bit-Wort bearbeitet. Diese Parallelarbeit spart weitere Zyklen ein.
Die einzelnen Berechnungsarten für die Relation des Speicherzeigers MP zu FP sind in den Beschreibungen für die Befehle Frame, Return und Set Stack Address im Detail erläutert. Bei dem Befehl Set Stack Adress kann die Speicheradresse von FP aus dem nur 7 Bit langen FP wieder errechnet werden. - b) Ein Stackzeiger wird nicht mehr benötigt. Dies bedeutet bei einer
Register-Register-Architektur eine wesentliche Vereinfachung, da nur
noch Registerbefehle (und Speicherbefehle) vorgesehen werden müssen
und keine der üblichen Stackbefehle (Push oder Pull) mehr gebraucht
werden. Ein kompakterer Befehlssatz schlägt sich unmittelbar in einer
stark vereinfachten Steuerung nieder, wie sie bei schnellen RISC-
Rechnern (Reduces Instruction Set Computer) benötigt wird. Die eine
Funktion des Stackzeigers, die Verwaltung von Zwischenergebnissen im
Stack, entfällt bei einer Register-Register-Architektur sowieso. Die
andere Funktion, die Bestimmung der Anfangsadresse einer neuen
Stack-Generation, wird durch die Erfindung anders und einfacher wie
folgt gelöst:
Durch den Frame-Befehl wird nur die Maximallänge der laufenden Stack-Generation festgelegt, ein Call-Befehl schließt eine neue Stack- Generation jedoch in der Regel nicht mehr an die Maximallänge der laufenden Stack-Generation an, sondern erst der Call-Befehl legt den Beginn der neuen Stack-Generation innerhalb der Maximallänge der laufenden Stack-Generation fest.
Dieses neue Verfahren darf nicht mit Variation 7) nach dem Stand der Technik verwechselt werden, bei dem vom Call-Befehl bereits die Länge der neuen Stack-Generation entsprechend dem Bedarf des augerufenen Unterprogramms festgelegt wird.
Außer dem Wegfall des Stackzeigers besteht der große Vorteil des neuen Verfahrens darin, daß sich eine neue Stack-Generation direkt nur an die momentan belegten Variablen (und eventuellen Übergangsparametern) anschließt. In der Regel schließt sich so eine neue Stack-Generation an eine gegenüber Maximallänge deutlich verkürzte vorherige Stack-Generation an.
Die Kombination von Merkmal a) und b) erzielt mit einer Stack-
Registerbank von nur 64 Registern durch die sparsame Belegung von
Registern fast den gleichen Effekt wie er nach dem Stand der Technik
nur mit einer doppelt so großen Stack-Registerbank erzielbar ist. Dies
bedeutet eine große Einsparung von Fläche auf einem Rechner-Chip und
eine kürzere Register-Lese- und -Einschreibzeit (wegen kleinerer
Kapazitäten) und damit auch eine wesentlich verkleinerte Zykluszeit.
Register Lesen, Verarbeiten und Ergebnis wieder in Register Schreiben
benötigt bei dieser Methode nur einen einzigen, sehr kurzen Zyklus,
während beim Stand der Technik wegen der großen Registeranzahl und der
dadurch bedingten längeren Register-Lese- und Schreibzeiten diese
besagten Vorgänge auf mehrere Zyklen aufgeteilt werden müssen.
Ein weiterer Vorteil einer verminderten Zahl von Registern pro Stack-
Generation besteht darin, daß bei einem Prozeßwechsel (Task-Wechsel)
weniger Register in den Speicherbereich des Stacks abgespeichert und
danach wieder geladen werden müssen.
Ein 32-Bit-Rechner, der dieses Verfahren benutzt, ist als Blockschaltbild in
Abb. 3 dargestellt. Es sind nur die für die Erfindung relevanten
Einzelheiten gezeigt. Die einzelnen Bausteine haben folgende Funktion:
Die Register 0 . . 63 stellen den Registerteil des Stacks dar. Sie werden als
Lokal-Register relativ zu Bit 5 . . 0 des Generationszeigers FP adressiert,
das heißt, jeweils die aktuelle Stack-Generation (max. 16 Register) kann
als Lokal-Register (L 0 . . max. L 15) mittels des Registercodes eines Befehls
adressiert werden. Ihre absolute Stack-Registeradresse errechnet sich als
Absolutadresse: (=FP + Registercode) modulo 64;
das heißt, an die Absolutadresse 63 schließt sich die Absolutadresse 0 an
(wrap around), so daß die Relativadressen für die Adressierung als Lokal-
Register als linear fortlaufend aufsteigend betrachtet werden können.
Es sind 19 Global-Register vorhanden. Register G 0 . . G 15 werden mittels
des Rgistercodes eines Befehls adressiert. G 16 . . G 18 werden über einen
Hilfsbefehl (Doble-Word Move) adressiert. Folgende Register haben
Sonderfunktionen:
G 1 ist der Befehlszähler. Er wird von der Steuerung entweder fortlaufend
hochgezählt (wenn kein Sprung) oder mit einer Sprungadresse geladen (falls
Sprung).
G 16 ist der Speicherzeiger MP. Der Speicherzeiger MP enthält die Adresse
der ersten freien Speicherstelle im Speicherteil des Stacks (Top of
Memory Stack), das ist die Adresse, an die das erste Stack-Register
(absolut adressiert durch MP Bit 7 . . 2) vom Frame Befehl im Falle eines
Überlaufs des Registerteils des Stacks abgespeichert würde.
G 17 enthält die untere Stackgrenze LB des Speicherteils des Stacks
(einschließlich). LB wird vom Return-Befehl benutzt, um ein
Unterschreiten der unteren Stackgrenze zu verhindern.
G 18 enthält die obere Stackgrenze UB des Speicherteils des Stacks
(einschließlich). UB wird vom Frame-Befehl benutzt, um ein Überschreiten
der oberen Stackgrenze zu verhindern.
G 0 ist das Status-Register SR.
Bit 20 . . 0 enthalten die übliche, für die Erfindung nicht relevante
Statusinformation, z. B. Condition-Bits (C, Z, N, V), verschiedene Modus-
Bits und einen Befehlslängen-Code ILC (Bit 20, 19) für die Länge (1 . . 3
Halbworte) des zuletzt ausgeführten Befehls.
Bit 31 . . 25 von SR enthält den 7-Bit-Generationszeiger FP.
Die niedersten 6 Bits von FP zeigen auf (adressieren) den Anfang der
laufenden Stack-Generation, das heißt, sie zeigen auf das Lokal-Register
L 0. Der Generationsanzeiger FP ist identisch mit Bit 8 . . 2 der Speicher-
Stackadresse, an die der Inhalt von L 0 abgespeichert würde, wenn er in
den Speicherteil des Stack geschoben (pushed) würde.
Bit 24 . . 21 von SR enthält die maximale Generationslänge FL.
FL enthält die Maximal-Anzahl (einschließlich übergebener Parameter
(nach Frame) und schließlich Rückkehr-SR und -PC) der in der
laufenden Stack-Generation zur Verfügung stehenden (benutzbaren) Lokal-
Register in der mit L 0 beginnenden Registerfolge. FL = 0 wird immer als
Fl = 16 interpretiert.
K ist ein 9-Bit Internzähler. Nur Bit 8 . . 0 sind als Zählerbits
implementiert, Bit 31 . . 9 werden beim Auslesen immer gleich dem
Vorzeichenbit 8 gesetzt. Bit 1 . . 0 sind immer 0.
K[8 . . 2] hält die negierte Anzahl der vom Frame-Befehl in den Speicherteil
des Stack zu speichernden (push) oder vom Return-Befehl daraus
auszulesenden (pull) Stack-Registerworte.
Die 32-Bit-Alu verknüpft Quell(Y)- und Ziel(X)-Operand arithmetisch oder
logisch einschließlich Schieben (shift). Das Ergebnis kann wieder in das
Ziel(X)-Operandenregister eingeschrieben werden.
Für die Y- und X-Registeradresse ist je ein Adreßaddierer/Subtrahierer
mit angeschlossenem Y- oder X-Adreßregister (AYR und AXR) vorhanden.
Die Registeradressen werden in einem dem jeweiligen Datenverknüpfungs
zyklus vorangehenden Dekodierzyklus errechnet und in AYR oder AXR
gespeichert.
Das Y-Register dient für den Quell(Y)-Operand, das X-Register für den
Ziel(X)-Operand als Zwischenspeicher.
In die Lokal- und Global-Register können auch Datenworte aus dem
Speicher über einen zweiten Schreibpfad direkt eingeschrieben werden.
Für die nachfolgenden Befehlsbeschreibungen und Zeichnungen gelten
folgende Definitionen:
- - Ein Wort im Register oder Speicher ist 32 Bit breit, Bit 0 bezeichnet das niederwertigste Bit, Bit 31 das höchstwertige Bit.
- - Operand [x . . y] bezeichnet die Bits x bis y eines Operanden.
Beispiel: MP[8 . . 2] bezeichnet Bit 8 . . 2 von MP. - - Ausdruck bezeichnet einen Operanden, der durch den Wert des Ausdrucks adressiert wird, das heißt der Wert des Ausdrucks wird als Adresse verwendet. Die Adresse kann einen Wert (ein Wort) in einem Stack-Register oder im Speicher adressieren; dies geht jeweils aus der beigefügten Bezeichnung "register" oder "memory" hervor.
- - := bezeichnet eine Zuweisung mit der Bedeutung von "wird ersetzt durch".
- - <, <=, < bedeuten "größer als", größer als oder gleich" sowie "kleiner als".
Die Sprungadresse wird in den Befehlszähler PC gesetzt. Der X-
Registercode wird nach FL geladen.
Dann wird der alte Inhalt von SR an das mit (FP + FL) modulo 64, der
alte Inhalt von PC in das mit (FP + FL + 1) modulo 64 adressierte
Stack-Register geladen. Der alte Inhalt von SR und PC stellt den Zustand
zu Beginn des Befehls dar, das heißt, bevor FL durch den X-Registercode
und PC durch die Sprungadresse überladen wurde. Der alte Inhalt wird in
Registern gehalten, die (auch aus anderen Gründen) immer die Kopie von
SR und PC zu Beginn des Befehls enthalten.
Der alte Inhalt von PC enthält die vom Return-Befehl benötigte
Rücksprungadresse. Der alte Inhalt von SR enthält alle für den Rückkehr-
Zustand nötige Statusinformation, insbesondere FP und FL der laufenden
Stack-Generation.
Anschließend wird FP um den Wert von FL (FL = 0 wird als FL = 16
interpretiert) erhöht und FL auf 6 gesetzt. Auf diese Weise wird eine
neue Stack-Generation erzeugt. Das abgespeicherte SR kann in der neuen
Stack-Generation als Lokal-Register L 0, der abgespeicherte PC als L 1
adressiert werden. Da FL auf 6 gesetzt wurde, sind L 2 . . L 5 frei verfügbar.
Der Wert des X-Registercodes (0 wird als 16 interpretiert) darf den Wert
von FL der laufenden Stack-Generation (FL = 0 wird als FL = 16
interpretiert) nicht überschreiten, da sonst die neue Stack-Generation
jenseits der maximal für die laufende Stack-Generation durch FL
festgelegte Länge angefügt würde. Dies könnte zum unbeabsichtigten
Überschreiten von Registern am Beginn des Registerteil des Stacks führen.
Da der Call-Befehl nicht auf Stack-Register-Überlauf testet, muß vor
einem weiteren Call-Befehl ein Frame-Befehl ausgeführt werden. Ein
Frame-Befehls muß auch ausgeführt werden, wenn die neue Stack-
Generation rekonstruiert werden muß (Rücksetzen von FP zur
Einbeziehung übergebener Parameter, neue Maximallänge FL, siehe Frame-
Befehl).
Im allgemeinen wird die vom Call-Befehl gesetzte Länge von FL = 6
nicht mit der in der neuen Stack-Generation benötigten Maximallänge
überinstimmen.
Für den Fall jedoch, daß keine Parameter übergeben wurden und kein
weiteres Unterprogramm aufgerufen wird, kann auf die Ausführung eines
Frame-Befehls verzichtet werden und FL = 6 stellt einen guten
Durchschnittswert für die Maximallänge dar. Bei einer größeren
voreingestellten Maximallänge FL würden oft zu viele Stack-Register
reserviert und damit oft unnötigerweise zu viele Register in den
Speicherteil des Stack abgespeichert.
Die entsprechende Darstellung in Pascal ist:
PC := Sprungadresse;
FL := X-Registercode;
register(FP + FL) := SR alt; - Status von SR vor Call-Befehl
register(FP + FL + 1) := PC alt; -Rücksprungadresse
FP := FP + FL;
FL := 6;
FL := X-Registercode;
register(FP + FL) := SR alt; - Status von SR vor Call-Befehl
register(FP + FL + 1) := PC alt; -Rücksprungadresse
FP := FP + FL;
FL := 6;
Der Call-Befehl wird in drei Zyklen ausgeführt.
Der Trap-Befehl wird ähnlich wie der Call-Befehl ausgeführt. Im
Unterschied zum Call-Befehl wird SR an das durch (FP + FL) modulo 64
und PC in das durch (FP + FL + 1) modulo 64 adressierte Stack-Register
geladen, da keine Registeradresse zur Verfügung steht.
FL wird auf 6 gesetzt. Der Unterprogrammsprung erfolgt an eine durch
ein Adreßbyte vorgegebene Einsprungadresse. Außerdem wird ein - für die
Erfindung nicht relevanter - Supervisor-Modus im Status-Register SR
eingeschaltet.
Die entsprechende Darstellung in Pascal ist:
PC := Entry-Adresse - Sprung in Entry-Tabelle
register(FP + FL) := SR alt; -Status von SR vor Trap-Befehl
register(FP + FL + 1) := PC alt; - Rücksprungadresse
FP := FP + FL;
FL := 6;
Supervisor-Modus-Bit := 1;
register(FP + FL) := SR alt; -Status von SR vor Trap-Befehl
register(FP + FL + 1) := PC alt; - Rücksprungadresse
FP := FP + FL;
FL := 6;
Supervisor-Modus-Bit := 1;
Der Trap-Befehl wird in drei Zyklen ausgeführt.
Ein Frame-Befehl hat folgende Aufgaben:
- - Zurücksetzen des Generationszeigers FP, um die übergebenen Parameter als Lokal-Register adressieren zu können;
- - Einstellen der maximal verfügbaren Anzahl von Lokal-Registern durch Setzen von FL;
- - Reservierung von 10 Reserveregistern, um weitere Call- oder Trap- Befehle ausführen zu können.
Der Generationszeiger FP wird um den Wert des Y-Registercodes
vermindert und der Wert von FL wird durch den Wert des X-Registercodes
ersetzt. Dann wird die Differenz
freie Register - (benötigte Register + 10)
errechnet und in den Differenzzähler K[8 . . 2] gesetzt, K[1 . . 0] ist 0.
freie Register - (benötigte Register + 10)
errechnet und in den Differenzzähler K[8 . . 2] gesetzt, K[1 . . 0] ist 0.
Ist die Differenz nicht negativ, so sind die benötigten Lokal-Register plus
die Reserve von 10 im Registerteil des Stacks verfügbar und der Frame-
Befehl ist beendet.
Wenn die Differenz negativ ist, wird ein temporärer Speicherzeiger
MPtemp als MPtemp := MP - K errechnet.
(Da die Differenz negativ ist, ist MPtemp höher als MP).
Dann wird MPtemp mit der in UB gespeicherten Obergrenze des
Speicherstacks verglichen.
Ist MPtemp höher als UB, würde also durch die Abspeicherung von Stack-
Registern die Obegrenze des Stacks im Speicher überschritten, so werden
FP und FL wieder auf ihren alten Wert gesetzt, der derzeitige (alte) Wert
von MP bleibt erhalten und es erfolgt ein Unterprogrammsprung in ein
spezifisches Fehlerunterprogramm (Frame Error).
Wird die Obergrenze des Stacks nicht überschritten, so werden die Anzahl
Stack-Register, die der vorher errechneten negativen Differenz in K[8 . . 2]
entspricht, in den Speicherteil des Stacks abgespeichert.
Dabei wird das erste Stack-Register mit der Registeradresse aus Bit 7 . . 2
von MP an die Adresse von MP abgespeichert; MP wird dann laufend um
4 Bytes (= ein 32-Bit-Wort) erhöht und die weiteren Stack-Register mit
der erhöhten Registeradresse an die erhöhte Adresse von MP
abgespeichert. Die Differenz wird in dem Differenzzähler K jeweils um 4
Bytes hochgezählt; die Abspeicherschleife wird beendet, wenn K auf 0
hochgezählt ist.
Die Reserve von 10 Stack-Registern wird wie folgt verwendet:
Ein Call- oder Trap-Befehl belegt sechs Register;
ein etwa folgender Ausnahme-Unterprogrammsprung (verursacht durch eine Sonderbedingung) belegt weitere zwei Register (FL wird auf 2 gesetzt);
ein Fehler "Frame Error" bei der Ausführung eines Frame-Befehls in einem Ausnahme-Unterprogramm (exception subprogram) belegt die verbleibenden zwei Register.
Ein Call- oder Trap-Befehl belegt sechs Register;
ein etwa folgender Ausnahme-Unterprogrammsprung (verursacht durch eine Sonderbedingung) belegt weitere zwei Register (FL wird auf 2 gesetzt);
ein Fehler "Frame Error" bei der Ausführung eines Frame-Befehls in einem Ausnahme-Unterprogramm (exception subprogram) belegt die verbleibenden zwei Register.
Die entsprechende Darstellung in Pascal ist:
FP := FP-Y-Registercode;
FL := X-Registercode;
K[8 . . 2] := MP[8 . . 2] + (64-10)-(FP + FL); K[1 . . 0] := 0; -64 = Anzahl Stack-Register, 10 = Reserve
if K < = 0 then next instruction; - Befehl ist beendet wenn K nicht negativ
MPtemp := MP-K; -MPtemp < MP, da K negativ if MP < UB then
FP := old FP;
FL := old FL;
trap -< Frame Error; - Überlauf Speicherteil des Stacks repeat
memory MP := stack register MP[7 . . 2]; - abspeichern Stack-Register - < Speicherteil des Stack MP := MP + 4;
K := K + 4;
until K = 0;
FL := X-Registercode;
K[8 . . 2] := MP[8 . . 2] + (64-10)-(FP + FL); K[1 . . 0] := 0; -64 = Anzahl Stack-Register, 10 = Reserve
if K < = 0 then next instruction; - Befehl ist beendet wenn K nicht negativ
MPtemp := MP-K; -MPtemp < MP, da K negativ if MP < UB then
FP := old FP;
FL := old FL;
trap -< Frame Error; - Überlauf Speicherteil des Stacks repeat
memory MP := stack register MP[7 . . 2]; - abspeichern Stack-Register - < Speicherteil des Stack MP := MP + 4;
K := K + 4;
until K = 0;
Der Return-Befehl bewirkt einen Rücksprung von einem Unterprogramm.
Der Inhalt des mit dem Y-Registercode adressierten Registers wird in das
Status-Register SR, der Inhalt des nachfolgenden Registers in den
Befehlszähler PC übertragen.
Dann wird abgeprüft, ob die nun wiederhergestellte laufende Stack-
Generation sich vollständig im Registerteil des Stacks befindet. Dies ist
dann der Fall, wenn der auf 32 Bit expandierte Inhalt des
Generationszeigers FP nicht niedriger als der Inhalt von MP ist, also der
expandierte Inhalt von FP nicht in den Speicherteil des Stacks zeigt. Da
die Differenz zwischen MP und expandiertem FP nur maximal 64 (Zahl
der Stack-Register) betragen kann, genügt es, Bit 8 . . 2 von MP mit FP zu
vergleichen.
Die Differenz FP-MP[8 . . 2] wird dazu nach K[8 . . 2] gesetzt, K[1 . . 0] ist 0.
Ist die Differenz nicht negativ, dann befindet sich die laufende Stack-
Generation ganz im Registerteil des Stack und der Return-Befehl ist
damit beendet.
Eine negative Differenz in K[8 . . 2] zeigt die Anzahl der vom Speicherteil
des Stack zu ladenden Register an.
Mittels K wird dann ein temporärer Speicherzeiger MPtemp
MPtemp := MP + K
errechnet.
MPtemp := MP + K
errechnet.
MPtemp wird dann mit der in LB gespeicherten Untergrenze des
Speicherstack verglichen. Ist MPtemp kleiner als LB, würde also die
Untergrenze des Stacks unterschritten, so bleibt der alte Wert von MP
erhalten und es erfolgt ein Unterprogrammsprung in ein spezifisches
Fehlerunterprogramm (Range Error).
Ist MPtemp nicht kleiner als LB, so wird er nach MP übertragen. Aus
dem Speicherteil des Stacks werden eine Anzahl 32-Bit-Worte
entsprechend der Differenz K[8 . . 2] in die Stack-Register geladen. Das
erste Wort wird von der mit MPtemp adressierten Speicherstelle in das
Stack-Register mit der Registeradresse aus Bit 7 . . 2 von MPtemp
übertragen. MPtemp und damit auch die Stack-Registeradresse werden
dann fortlaufend um 4 Bytes erhöht und weitere Worte übertragen. Die
Differenz wird in dem Differenzzähler K jeweils auch um 4 Bytes
hochgezählt; die Schleife wird beendet, wenn K auf 0 hochgezählt ist.
Die entsprechende Darstellung in Pascal ist:
PC := Register following Y-Register;
SR := Y-Register;
K[8 . . 2] := FP-MP[8 . . 2]; K[1 . . 0] := 0;
if K <= 0 then next instruction; - Befehl ist beendet wenn K nicht negativ
MPtemp := MPtemp + K; - MPtemp < MP, da K negativ
if MP < UB then trap -< Range Error;
MP := MPtemp;
repeat
stack register MPtemp[7 . . 2] := MPtemp; - laden Speicherteil des Stacks -< Stack-Register
MPtemp := MPtemp + 4;
K : K + 4;
until K = 0;
SR := Y-Register;
K[8 . . 2] := FP-MP[8 . . 2]; K[1 . . 0] := 0;
if K <= 0 then next instruction; - Befehl ist beendet wenn K nicht negativ
MPtemp := MPtemp + K; - MPtemp < MP, da K negativ
if MP < UB then trap -< Range Error;
MP := MPtemp;
repeat
stack register MPtemp[7 . . 2] := MPtemp; - laden Speicherteil des Stacks -< Stack-Register
MPtemp := MPtemp + 4;
K : K + 4;
until K = 0;
Der Setze-Stackadresse-Befehl expandiert den Generationszeiger FP auf
die Länge des Speicherzeigers MP und setzt das Ergebnis in das mit dem
X-Registercode adressierte Register. FP selbst bleibt unverändert.
Die expandierte FP-Adresse ist die Adresse, an die das Lokal-Register L 0
in den Speicherteil des Stacks abgespeichert würde.
Der gewählte Algorithmus beruht darauf, daß die expandierte FP-Adresse
nur innerhalb des Bereichs von 0 . . 63 32-Bit-Worten gleich oder höher als
die Adresse in MP sein kann.
Zur Errechnung der expandierten FP-Adresse werden Bit 31 . . 9 von MP, FP
und 2 Null-Bits zu einer 32-Bit-Adresse verbunden. Zur Korrektur wird
nach Bit 9 dieser Adresse dann ein Übertrag aufaddiert, wenn Bit 8 von
MP = 1 und Bit 6 (das höchste Bit) von FP = 0 sind.
Die entsprechende Formel lautet:
X-Register := MP[31 . . 9] / / FP / / 00 + Übertrag nach Bit 9
- Übertrag nach Bit 9 := MP[8] = 1 und FP[6] = 0
- / / bedeutet "verbunden zu einem Wert" (Concatenation)
- Übertrag nach Bit 9 := MP[8] = 1 und FP[6] = 0
- / / bedeutet "verbunden zu einem Wert" (Concatenation)
Der Setze-Stackadresse-Befehl errechnet somit die Stackadresse der
laufenden Stack-Generation. Wenn diese Stackadresse gespeichert wird
(z. B. in einem Global-Register), können dann mit Hilfe dieser Stackadresse
auch Variable und Parameter älterer Stack-Generationen adressiert werden,
und zwar unabhängig davon, ob sie sich in Stack-Registern befinden oder
im Speicherteil des Stacks.
Dies wird bei Lade- und Abspeicherbefehlen durch einen besonderen Stack-
Adreß-Modus erreicht. Die effektive Stackadresse errechnet sich hierbei
aus der Stackadresse plus einer im Speicherbefehl angegebenen
Displacement-Konstanten. Die effektive Stackadresse wird dann mit dem
Speicherzeiger MP verglichen. Ist die effektive Stackadresse niedriger als
der Wert des Speicherzeigers MP, so befindet sich der adressierte Wert im
Speicherteil des Stacks und es erfolgt ein Speicherzugriff; andernfalls
befindet sich der adressierte Wert in dem durch Bits 7 . . 2 der effektiven
Stackadresse adressierten Stack-Register.
Claims (15)
1. Mehrbit-Rechner (Stacksteuerung), insbesondere in seiner Ausbildung
als Mikroprozessor, bei dem ein oder mehrere Speicher vorhanden sind,
und ein Teil des Speichers als Laufzeitstack - im folgenden als Stack
(Stapel) bezeichnet - ausgebildet ist, der wiederum in einen Register
teil und in einen Speicherteil aufgeteilt ist, bei dem ferner der
oberste Teil des Stacks als Stack-Registerbank ausgebildet ist und die
aktuelle - oder die aktuellsten - Stackgeneration(en) in dieser
Registerbank gehalten wird, und die Speicheradresse des ersten abzu
speichernden Registers - das ist der oberste noch nicht belegte
adressierte Speicherplatz des Stacks im Speicher - in einem Speicher
zeiger MP gehalten wird, der als Folge des Abspeicherns (Push) von
Stack-Registern hochgezählt und als Folge des Wiederholens (Pull) dieser
Stack-Register heruntergezählt wird (alternativ ist auch die umgekehrte
Arbeitsweise möglich, wobei ferner ein Statusregister SR, welches den
aktuellen Status des Rechners enthält, sowie der alte Stand des
Befehlszählers, der die Rückkehradresse enthält, während eines
Unterprogrammsprungs in den Registerteil des Stacks abgespeichert
werden, und außerdem ein Generationszeiger FP, welcher jeweils auf die
Register-Anfangsadresse einer Stackgeneration im Registerteil des Stacks
zeigt (addressiert) während eines Unterprogrammsprungs abgespeichert
wird, dadurch gekennzeichnet, daß der vor dem
Unterprogrammsprung gültige Generationszeiger FP als Teil des Status
wortes im Statusregister SR untergebracht ist, und im gleichen Zyklus
bei Aufruf des Unterprogramms (Call-Befehl) zusammen mit dem Status
wort in dem vor dem Unterprogrammsprung-Aufruf gültigen Zustand abge
speichert wird, und daß bei Rückkehr (Return) vom Unterprogramm der
Generationszeiger FP als Teil des Statuswortes wieder in das
Statusregister SR zurückgebracht wird.
2. Mehrbit-Rechner (Stack-Steuerung), insbesondere in seiner Ausbildung
als Mikroprozessor, bei dem ein oder mehrere Speicher vorhanden sind,
und ein Teil des Speichers als Laufzeitstack - im folgenden als Stack
(Stapel) bezeichnet - ausgebildet ist, der wiederum in einen
Registerteil und in einen Speicherteil aufgeteilt ist, bei dem ferner
der oberste Teil des Stacks als Stack-Registerbank ausgebildet ist und
die aktuelle - oder die aktuellsten - Stackgeneration(en) in dieser
Registerbank gehalten wird, und die Speicheradresse des ersten
abzuspeichernden Registers - das ist der oberste noch nicht belegte
adressierte Speicherplatz des Stacks im Speicher - in einem
Speicherzeiger MP gehalten wird, der als Folge des Abspeicherns (Push)
von lokalen Registern hochgezählt und als Folge des Wiederholens (Pull)
dieser lokalen Register heruntergezählt wird (alternativ ist auch die
umgekehrte Arbeitsweise möglich), wobei ferner ein Statusregister SR,
welches den aktuellen Status des Rechners enthält, sowie der alte Stand
des Befehlszählers, der die Rückkehradresse enthält, während eines
Unterprogramms in den Registerteil des Stacks abgespeichert
werden, außerdem ein Generationszeiger FP, welcher jeweils auf die
Register-Anfangsadresse einer Stackgeneration im Registerteil des Stacks
zeigt (adressiert) während eines Unterprogrammsprungs abgespeichert
wird,
dadurch gekennzeichnet, daß der Unterprogrammaufruf
die neue Stack-Generation nicht mehr an die von einem Stackzeiger
festgelegte Maximallänge der laufenden Stack-Generation, sondern die
neue Stack-Generation unter Verzicht auf einen Stackzeiger an die
momentanen Länge der laufenden Stackgeneration anschließt.
3. Mehrbit-Rechner nach einem der Ansprüche 1 oder 2,
dadurch gekennzeichnet, daß der Generationszeiger
FP um mindestens 1 Bit länger ist als notwendig wäre, um den
Adressierbereich der Stack-Registerbank darstellen zu können, aber
kürzer als der Adressierbereich einer vollen Speicheradresse, z. B. 32
Bit.
4. Mehrbit-Rechner nach einem der Ansprüche 1 bis 3,
dadurch gekennzeichnet, daß der Generationszeiger
FP nach Anspruch 3, der die Register im Registerteil des Stacks
adressiert, nach folgendem Rechenverfahren zu einer 32 Bit langen
Stackadresse aufgeweitet wird (die Stackadresse überstreicht sowohl den
Speicherteil des Stacks, als auch den Registerteil des Stacks, wie er in
den Speicher abgelegt werden würde):
Stackadresse: = MP [31 . . 9] / / FP / /00 + Übertrag nach Bit 9- Übertrag nach Bit 9: = MP [8] = 1 und FP 6 = 0
5. Mehrbit-Rechner nach einem der Ansprüche 1 bis 4, dadurch
gekennzeichnet, daß eine Erhöhung oder Verminderung des
Generationszeigers FP im X- oder Y-Adreßrechenwerk gleichzeitig
(parallel) mit der Errechnung von anderen Werten (32 bit langen
Operanden), in der ALU erfolgt.
6. Mehrbit-Rechner nach einem der Ansprüche 1 bis 5, dadurch
gekennzeichnet, daß bei der Ausführung eines Frame-
Befehls geprüft wird, ob die noch zur Verfügung stehende Anzahl von
freien Stack-Registern für die laufende Stack-Generation ausreicht und
daß, wenn dies nicht der Fall ist, mindestens die fehlende Anzahl von
Stack-Registern in den Speicherteil des Stacks abgespeichert wird.
7. Mehrbit-Rechner nach Anspruch 6, dadurch
gekennzeichnet, daß der Frame-Befehl zusätzlich zu den nach
Anspruch 6 abzuspeichernden Registern noch soviele weitere
Stack-Register abspeichert, daß eine Reserveanzahl in Höhe der vom Call-
Befehl sowie von zwei weiteren aufeinanderfolgenden
Ausnahme-Unterprogrammsprüngen benötigten Anzahl verfügbar ist.
8. Mehrbit-Rechner nach einem der Ansprüche 1-5,
dadurch gekennzeichnet, daß gleichzeitig mit dem
Abspeichern von Stack-Registern (Push) durch einen Frame-Befehl die
obere Stackgrenze des Speicherbereichs des Stacks auf Überschreitung
abgeprüft wird.
9. Mehrbit-Rechner nach Anspruch 6, dadurch
gekennzeichnet, daß bei einer möglichen Überschreitung die
Register nicht abgespeichert werden, und daß stattdessen der Rechner in
ein Fehler-Unterprogramm verzweigt.
10. Mehrbit-Rechner nach einem der Ansprüche 1 bis 9, dadurch
gekennzeichnet, daß bei der Ausführung eines Return-Befehls
durch Vergleich des Speicherzeigers MP mit dem Generationszeiger FP der
wiederhergestellten Stack-Generation festgestellt wird, ob die
wiederhergestellte Stack-Generation vollständig in den Stack-Registern
enthalten ist und daß, falls sie nicht vollständig enthalten ist, die
fehlende Anzahl Stack-Register aus dem Speicherteil des Stacks
eingelesen wird.
11. Mehrbit-Rechner nach einem der Ansprüche 1-7, dadurch
gekennzeichnet, daß gleichzeitig mit dem Wiederladen von
Stack-Registern durch einen Return-Befehl die unter Stackgrenze des
Speicherbereichs des Stacks auf Unterschreitung abgeprüft wird.
12. Mehrbit-Rechner nach Anspruch 8, dadurch
gekennzeichnet, daß bei einer möglichen Unterschreitung die
Stack-Register nicht wieder geladen werden, und stattdessen der Rechner
in ein Fehler-Unterprogramm verzweigt.
13. Mehrbit-Rechner nach einem der Ansprüche 1-9,
dadurch gekennzeichnet, daß im Statusregister SR
die maximale Generationslänge FL enthalten ist und FL die Maximal-
Anzahl der in der laufenden Stack-Generation zur Verfügung stehenden
(benutzbaren) Lokal-Register (d. h. die übergebenen Parameter +
Lokalvariable + zu übergebene Parameter) enthält.
14. Mehrbit-Rechner nach Anspruch 10, dadurch
gekennzeichnet, daß der Wert von FL = 0 als FL = 16
interpretiert wird.
15. Mehrbit-Rechner nach Anspruch 10 und 11, dadurch
gekennzeichnet, daß die max. Generationslänge FL dazu
benutzt wird, um an der Lokal-Registeradresse FP + FL den Beginn einer
neuen Stackgeneration in dem Falle festzulegen, in dem eine neue
Stackgeneration nicht durch einen Unterprogrammsprung (Call-Befehl)
sondern durch eine Sonderbedingung (exception oder trap) angelegt wird;
in diesem Fall und nur in diesem Fall wird die Maximallänge der max.
Generationslänge FL ausgenutzt.
Priority Applications (8)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
DE19873726192 DE3726192A1 (de) | 1987-08-06 | 1987-08-06 | Stacksteuerung |
DE3888259T DE3888259T2 (de) | 1987-08-06 | 1988-07-28 | Stapelspeichersteuerung. |
EP88112251A EP0303868B1 (de) | 1987-08-06 | 1988-07-28 | Stapelspeichersteuerung |
AT88112251T ATE102718T1 (de) | 1987-08-06 | 1988-07-28 | Stapelspeichersteuerung. |
US07/228,528 US4969091A (en) | 1987-08-06 | 1988-08-04 | Apparatus for stack control employing mixed hardware registers and memory |
JP63195917A JPH0199130A (ja) | 1987-08-06 | 1988-08-05 | コンピュータのスタック制御装置 |
KR1019880010112A KR920003274B1 (ko) | 1987-08-06 | 1988-08-06 | 혼합 하드웨어 레지스터 및 메모리를 이용한 스택제어용 장치 |
HK62195A HK62195A (en) | 1987-08-06 | 1995-04-27 | Stack control |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
DE19873726192 DE3726192A1 (de) | 1987-08-06 | 1987-08-06 | Stacksteuerung |
Publications (1)
Publication Number | Publication Date |
---|---|
DE3726192A1 true DE3726192A1 (de) | 1989-02-16 |
Family
ID=6333220
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE19873726192 Withdrawn DE3726192A1 (de) | 1987-08-06 | 1987-08-06 | Stacksteuerung |
DE3888259T Expired - Lifetime DE3888259T2 (de) | 1987-08-06 | 1988-07-28 | Stapelspeichersteuerung. |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE3888259T Expired - Lifetime DE3888259T2 (de) | 1987-08-06 | 1988-07-28 | Stapelspeichersteuerung. |
Country Status (7)
Country | Link |
---|---|
US (1) | US4969091A (de) |
EP (1) | EP0303868B1 (de) |
JP (1) | JPH0199130A (de) |
KR (1) | KR920003274B1 (de) |
AT (1) | ATE102718T1 (de) |
DE (2) | DE3726192A1 (de) |
HK (1) | HK62195A (de) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE3914195A1 (de) * | 1989-04-28 | 1990-10-31 | Siemens Ag | Stapelspeicheranordnung |
DE19640316A1 (de) * | 1996-09-30 | 1998-04-02 | Siemens Ag | Schaltungsanordnung mit einem Mikroprozessor und einem Stapelspeicher |
DE10228758A1 (de) * | 2002-06-27 | 2004-04-22 | Infineon Technologies Ag | Verfahren und Schaltungsanordnung zur Zuordnung von verfügbarem Speicherbereich innerhalb eines Schreib-Lese-Speichers |
Families Citing this family (54)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH02187825A (ja) * | 1989-01-13 | 1990-07-24 | Mitsubishi Electric Corp | コンピュータ |
US5107457A (en) * | 1989-04-03 | 1992-04-21 | The Johns Hopkins University | Stack data cache having a stack management hardware with internal and external stack pointers and buffers for handling underflow and overflow stack |
JP2655191B2 (ja) * | 1989-07-05 | 1997-09-17 | 三菱電機株式会社 | 演算処理装置 |
US5640582A (en) * | 1992-05-21 | 1997-06-17 | Intel Corporation | Register stacking in a computer system |
JP3211423B2 (ja) * | 1992-10-13 | 2001-09-25 | ソニー株式会社 | 分岐命令実行方法および分岐命令実行装置 |
US5893148A (en) * | 1994-03-03 | 1999-04-06 | International Business Machines Corporation | System and method for allocating cache memory storage space |
EP0676691A3 (de) * | 1994-04-06 | 1996-12-11 | Hewlett Packard Co | Vorrichtung zur Registersicherstellung und Umspeicherung in einem digitalen Rechner. |
US5655132A (en) * | 1994-08-08 | 1997-08-05 | Rockwell International Corporation | Register file with multi-tasking support |
US6185597B1 (en) * | 1995-06-07 | 2001-02-06 | Microsoft Corporation | Method and system for expanding a buried stack frame |
US5664120A (en) * | 1995-08-25 | 1997-09-02 | International Business Machines Corporation | Method for executing instructions and execution unit instruction reservation table within an in-order completion processor |
US5835958A (en) * | 1996-10-29 | 1998-11-10 | Sun Microsystems, Inc. | Method and apparatus for dynamically sizing non-contiguous runtime stacks |
US6219783B1 (en) * | 1998-04-21 | 2001-04-17 | Idea Corporation | Method and apparatus for executing a flush RS instruction to synchronize a register stack with instructions executed by a processor |
KR100319746B1 (ko) * | 1998-11-16 | 2002-02-19 | 오길록 | 칠컴파일러의실행시간스택프레임구성방법 |
US7117342B2 (en) * | 1998-12-03 | 2006-10-03 | Sun Microsystems, Inc. | Implicitly derived register specifiers in a processor |
US7114056B2 (en) * | 1998-12-03 | 2006-09-26 | Sun Microsystems, Inc. | Local and global register partitioning in a VLIW processor |
US20050149694A1 (en) * | 1998-12-08 | 2005-07-07 | Mukesh Patel | Java hardware accelerator using microcode engine |
US7225436B1 (en) | 1998-12-08 | 2007-05-29 | Nazomi Communications Inc. | Java hardware accelerator using microcode engine |
US6332215B1 (en) | 1998-12-08 | 2001-12-18 | Nazomi Communications, Inc. | Java virtual machine hardware for RISC and CISC processors |
GB2367654B (en) | 2000-10-05 | 2004-10-27 | Advanced Risc Mach Ltd | Storing stack operands in registers |
GB2367653B (en) | 2000-10-05 | 2004-10-20 | Advanced Risc Mach Ltd | Restarting translated instructions |
US20020069402A1 (en) * | 2000-10-05 | 2002-06-06 | Nevill Edward Colles | Scheduling control within a system having mixed hardware and software based instruction execution |
EP1197847A3 (de) * | 2000-10-10 | 2003-05-21 | Nazomi Communications Inc. | Java-Hardwarebeschleuniger mit Mikrokodemaschine |
GB2369464B (en) | 2000-11-27 | 2005-01-05 | Advanced Risc Mach Ltd | A data processing apparatus and method for saving return state |
US7076771B2 (en) | 2000-12-01 | 2006-07-11 | Arm Limited | Instruction interpretation within a data processing system |
GB2376098B (en) * | 2001-05-31 | 2004-11-24 | Advanced Risc Mach Ltd | Unhandled operation handling in multiple instruction set systems |
GB2376097B (en) | 2001-05-31 | 2005-04-06 | Advanced Risc Mach Ltd | Configuration control within data processing systems |
GB2376099B (en) * | 2001-05-31 | 2005-11-16 | Advanced Risc Mach Ltd | Program instruction interpretation |
GB2376100B (en) * | 2001-05-31 | 2005-03-09 | Advanced Risc Mach Ltd | Data processing using multiple instruction sets |
US8769508B2 (en) | 2001-08-24 | 2014-07-01 | Nazomi Communications Inc. | Virtual machine hardware for RISC and CISC processors |
JP2003271448A (ja) * | 2002-03-18 | 2003-09-26 | Fujitsu Ltd | スタック管理方法及び情報処理装置 |
US6950815B2 (en) * | 2002-04-23 | 2005-09-27 | International Business Machines Corporation | Content management system and methodology featuring query conversion capability for efficient searching |
US7035854B2 (en) * | 2002-04-23 | 2006-04-25 | International Business Machines Corporation | Content management system and methodology employing non-transferable access tokens to control data access |
US6947948B2 (en) * | 2002-04-23 | 2005-09-20 | International Business Machines Corporation | Version-enabled, multi-typed, multi-targeting referential integrity relational database system and methodology |
US7082455B2 (en) * | 2002-04-23 | 2006-07-25 | International Business Machines Corporation | Method and apparatus of parameter passing of structured data for stored procedures in a content management system |
US6938050B2 (en) | 2002-04-23 | 2005-08-30 | International Business Machines Corporation | Content management system and methodology employing a tree-based table hierarchy which accomodates opening a dynamically variable number of cursors therefor |
US6944627B2 (en) * | 2002-04-23 | 2005-09-13 | International Business Machines Corporation | Content management system and methodology employing a tree-based table hierarchy featuring arbitrary information retrieval from different locations in the hierarchy |
US6999966B2 (en) * | 2002-04-23 | 2006-02-14 | International Business Machines Corporation | Content management system and methodology for implementing a complex object using nested/recursive structures |
US20040003377A1 (en) * | 2002-06-28 | 2004-01-01 | Di Loreto Michael A. | Converting byte code instructions to a new instruction set |
US7131118B2 (en) * | 2002-07-25 | 2006-10-31 | Arm Limited | Write-through caching a JAVA® local variable within a register of a register bank |
US7299343B2 (en) * | 2002-09-27 | 2007-11-20 | Verisilicon Holdings (Cayman Islands) Co. Ltd. | System and method for cooperative execution of multiple branching instructions in a processor |
US7493478B2 (en) * | 2002-12-05 | 2009-02-17 | International Business Machines Corporation | Enhanced processor virtualization mechanism via saving and restoring soft processor/system states |
US7392246B2 (en) * | 2003-02-14 | 2008-06-24 | International Business Machines Corporation | Method for implementing access control for queries to a content management system |
GB2399897B (en) * | 2003-03-26 | 2006-02-01 | Advanced Risc Mach Ltd | Memory recycling in computer systems |
US7467386B2 (en) | 2004-01-16 | 2008-12-16 | International Business Machines Corporation | Parameter passing of data structures where API and corresponding stored procedure are different versions/releases |
GB2412192B (en) * | 2004-03-18 | 2007-08-29 | Advanced Risc Mach Ltd | Function calling mechanism |
US7802080B2 (en) | 2004-03-24 | 2010-09-21 | Arm Limited | Null exception handling |
US7930526B2 (en) | 2004-03-24 | 2011-04-19 | Arm Limited | Compare and branch mechanism |
FR2896600B1 (fr) * | 2006-01-24 | 2008-03-28 | Atmel Nantes Sa Sa | Dispositif de traitement en notation polonaise inversee pour la manipulation de tableau, et circuit integre electronique comprenant un tel dispositif de traitement |
US8151031B2 (en) * | 2007-10-31 | 2012-04-03 | Texas Instruments Incorporated | Local memories with permutation functionality for digital signal processors |
US8769233B2 (en) * | 2011-06-14 | 2014-07-01 | International Business Machines Corporation | Adjusting the amount of memory allocated to a call stack |
CN103575438A (zh) * | 2012-07-18 | 2014-02-12 | 天地科技股份有限公司 | 煤矿超前支承压力分布特征监测方法 |
US9330119B2 (en) | 2013-04-11 | 2016-05-03 | Oracle International Corporation | Knowledge intensive data management system for business process and case management |
US9239801B2 (en) * | 2013-06-05 | 2016-01-19 | Intel Corporation | Systems and methods for preventing unauthorized stack pivoting |
US10534643B2 (en) * | 2016-05-09 | 2020-01-14 | Oracle International Corporation | Correlation of thread intensity and heap usage to identify heap-hoarding stack traces |
Family Cites Families (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US3889243A (en) * | 1973-10-18 | 1975-06-10 | Ibm | Stack mechanism for a data processor |
FR2253425A5 (de) * | 1973-11-30 | 1975-06-27 | Honeywell Bull Soc Ind | |
US4217638A (en) * | 1977-05-19 | 1980-08-12 | Tokyo Shibaura Electric Co., Ltd. | Data-processing apparatus and method |
JPS5474651A (en) * | 1977-11-28 | 1979-06-14 | Toshiba Corp | Stack control system |
JPS5543136U (de) * | 1978-09-13 | 1980-03-21 | ||
JPS5616248A (en) * | 1979-07-17 | 1981-02-17 | Matsushita Electric Ind Co Ltd | Processing system for interruption |
US4313161A (en) * | 1979-11-13 | 1982-01-26 | International Business Machines Corporation | Shared storage for multiple processor systems |
US4524416A (en) * | 1980-04-15 | 1985-06-18 | Honeywell Information Systems Inc. | Stack mechanism with the ability to dynamically alter the size of a stack in a data processing system |
DE3270597D1 (en) * | 1981-06-30 | 1986-05-22 | Fujitsu Ltd | Data processing system |
US4399507A (en) * | 1981-06-30 | 1983-08-16 | Ibm Corporation | Instruction address stack in the data memory of an instruction-pipelined processor |
JPS5843043A (ja) * | 1981-09-08 | 1983-03-12 | Oki Electric Ind Co Ltd | デ−タ処理装置の呼び出し命令方式 |
JPS58103043A (ja) * | 1981-12-15 | 1983-06-18 | Matsushita Electric Ind Co Ltd | スタック形成方法 |
CA1187200A (en) * | 1982-02-24 | 1985-05-14 | David R. Ditzel | Computer with automatic mapping of memory contents into machine registers |
US4680698A (en) * | 1982-11-26 | 1987-07-14 | Inmos Limited | High density ROM in separate isolation well on single with chip |
JPS6149696A (ja) * | 1984-08-17 | 1986-03-11 | Yokogawa Hokushin Electric Corp | パルスモ−タ駆動装置 |
US4704679A (en) * | 1985-06-11 | 1987-11-03 | Burroughs Corporation | Addressing environment storage for accessing a stack-oriented memory |
US4777588A (en) * | 1985-08-30 | 1988-10-11 | Advanced Micro Devices, Inc. | General-purpose register file optimized for intraprocedural register allocation, procedure calls, and multitasking performance |
JPS62154143A (ja) * | 1985-12-27 | 1987-07-09 | Matsushita Electric Ind Co Ltd | マイクロコンピユ−タ |
-
1987
- 1987-08-06 DE DE19873726192 patent/DE3726192A1/de not_active Withdrawn
-
1988
- 1988-07-28 DE DE3888259T patent/DE3888259T2/de not_active Expired - Lifetime
- 1988-07-28 EP EP88112251A patent/EP0303868B1/de not_active Expired - Lifetime
- 1988-07-28 AT AT88112251T patent/ATE102718T1/de not_active IP Right Cessation
- 1988-08-04 US US07/228,528 patent/US4969091A/en not_active Expired - Lifetime
- 1988-08-05 JP JP63195917A patent/JPH0199130A/ja active Pending
- 1988-08-06 KR KR1019880010112A patent/KR920003274B1/ko not_active IP Right Cessation
-
1995
- 1995-04-27 HK HK62195A patent/HK62195A/xx not_active IP Right Cessation
Non-Patent Citations (1)
Title |
---|
US-Z.: Byte, April 1987, S. 177-185, D.L. Miller, Stack Machines and Compiler Design * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE3914195A1 (de) * | 1989-04-28 | 1990-10-31 | Siemens Ag | Stapelspeicheranordnung |
DE19640316A1 (de) * | 1996-09-30 | 1998-04-02 | Siemens Ag | Schaltungsanordnung mit einem Mikroprozessor und einem Stapelspeicher |
DE10228758A1 (de) * | 2002-06-27 | 2004-04-22 | Infineon Technologies Ag | Verfahren und Schaltungsanordnung zur Zuordnung von verfügbarem Speicherbereich innerhalb eines Schreib-Lese-Speichers |
Also Published As
Publication number | Publication date |
---|---|
HK62195A (en) | 1995-05-05 |
DE3888259T2 (de) | 1994-09-08 |
US4969091A (en) | 1990-11-06 |
KR890004236A (ko) | 1989-04-20 |
EP0303868A2 (de) | 1989-02-22 |
ATE102718T1 (de) | 1994-03-15 |
KR920003274B1 (ko) | 1992-04-27 |
DE3888259D1 (de) | 1994-04-14 |
JPH0199130A (ja) | 1989-04-18 |
EP0303868A3 (en) | 1989-10-11 |
EP0303868B1 (de) | 1994-03-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
DE3726192A1 (de) | Stacksteuerung | |
DE2935906C2 (de) | Mikroprozessor | |
DE1499193C3 (de) | Speicher-Adressierschaltung | |
DE2423194C2 (de) | Vorrichtung zum Berechnen einer absoluten Hauptspeicheradresse in einer Datenverarbeitungsanlage | |
DE4215063C2 (de) | Einrichtung und Verfahren zum Seitenwechsel bei einem nicht-flüchtigen Speicher | |
DE2230102A1 (de) | Rechenwerk fuer variable wortlaengen | |
DE2431379A1 (de) | Datenverarbeitungseinrichtung | |
DE2448690A1 (de) | Kellerspeichereinrichtung fuer eine datenverarbeitungsanlage | |
DE2718110A1 (de) | Datenverarbeitungseinheit | |
DE1285219B (de) | Steuerwerk zur Ausfuehrung von Unterprogrammen | |
DE2054835A1 (de) | Prozessor fur ein Informationsver arbeitungssystem und ein Betriebsver fahren fur diesen Prozessor | |
DE69816775T2 (de) | Vorrichtung zur datenverarbeitung mit stapelstruktur | |
DE2117581C3 (de) | Einrichtung zur Adressenprüfung | |
DE2458286A1 (de) | Datenverarbeitungssystem zum verschieben von datenfeldern mit verschiedenen strukturen | |
DE69918033T2 (de) | Zentrale Verarbeitungseinheit mit Befehl zur Datenverlängerung | |
DE2403039C2 (de) | Einrichtung zur Befehlsausführung in einer adressenerweiterten elektronischen Datenverarbeitungsanlage | |
EP1407348B1 (de) | Verfahren zum ansteuern einer zentralen verarbeitungseinheit für eine adressierung bezüglich eines speichers und controller | |
DE69937585T2 (de) | Verfahren zum willkürlichen Zugriff auf einen Speicherbereich einer digitalen Verarbeitungsvorrichtung in einem physikalischen Adressierungsmodus und einem virtuellen Adressierungsmodus und Vorrichtung zur Durchführung des Verfahrens | |
DE2331394B1 (de) | Datenverarbeitungsanlage mit virtueller adressierung | |
DE3104256C2 (de) | ||
DE2419522A1 (de) | Verfahren und anordnung zur unterteilung eines oder mehrerer nicht benutzter bereiche eines mit einem rechner verbundenen speichers | |
DE2954533C2 (de) | ||
EP1516245B1 (de) | Vorrichtung und verfahren zum verarbeiten einer sequenz von sprungbefehlen | |
DE2419836A1 (de) | Verfahren zur durchfuehrung von unterprogramm-sprungbefehlen in datenverarbeitungsanlagen | |
DE2419837B2 (de) | Schaltungsanordnung zur adressierung eines mikroprogramms in datenverarbeitungseinrichtungen und verfahren zur durchfuehrung von sprungbefehlen |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
OP8 | Request for examination as to paragraph 44 patent law | ||
8130 | Withdrawal |