DE3726192A1 - Stacksteuerung - Google Patents

Stacksteuerung

Info

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
Application number
DE19873726192
Other languages
English (en)
Inventor
Otto Mueller
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Individual
Original Assignee
Individual
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Individual filed Critical Individual
Priority to DE19873726192 priority Critical patent/DE3726192A1/de
Priority to DE3888259T priority patent/DE3888259T2/de
Priority to EP88112251A priority patent/EP0303868B1/de
Priority to AT88112251T priority patent/ATE102718T1/de
Priority to US07/228,528 priority patent/US4969091A/en
Priority to JP63195917A priority patent/JPH0199130A/ja
Priority to KR1019880010112A priority patent/KR920003274B1/ko
Publication of DE3726192A1 publication Critical patent/DE3726192A1/de
Priority to HK62195A priority patent/HK62195A/xx
Withdrawn legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/76Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data
    • G06F7/78Arrangements 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/785Arrangements 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30101Special purpose registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30134Register stacks; shift registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/34Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • G06F9/4486Formation 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:
Stack-Registerbank
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.
Global-Register
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:
Befehlszähler PC
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).
Speicherzeiger MP
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.
Untere Stackgrenze LB
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.
Obere Stackgrenze UB
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.
Status-Register SR
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.
Differenzzähler K
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.
Arithmetisch-Logische Einheit ALU
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.
Y- und X-Adreßrechenwerk
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.
Y- und X-Register
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".
Call-Befehl (Unterprogrammsprung)
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;
Der Call-Befehl wird in drei Zyklen ausgeführt.
Trap-Befehl
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;
Der Trap-Befehl wird in drei Zyklen ausgeführt.
Frame-Befehl
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.
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.
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;
Return-Befehl
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 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;
Setze-Stackadresse-Befehl
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)
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.
DE19873726192 1987-08-06 1987-08-06 Stacksteuerung Withdrawn DE3726192A1 (de)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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 マイクロコンピユ−タ

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
US-Z.: Byte, April 1987, S. 177-185, D.L. Miller, Stack Machines and Compiler Design *

Cited By (3)

* Cited by examiner, † Cited by third party
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