Information Technology Reference
In-Depth Information
korrekt zu positionieren. Die meisten 0-Adressarchitekturen verfügen deshalb über
Befehle, mit denen sich die Anordnung der Einträge auf dem Stapel verändern lässt
(z.B. mit einem Befehl swap zum Vertauschen der obersten beiden Stapeleinträge).
Des Weiteren stehen oft Befehle zur Verfügung, um Einträge auf dem Stapel zu ver-
vielfachen (z.B. der Befehl dup , um den obersten Stapeleintrag zu verdoppeln). Sie
werden benötigt, um einen einzelnen Wert mehrfach zu verarbeiten, da ein Operand
mit dem Zugriff vom Stapel entfernt wird. - In Tabelle 1.6 ist zu einigen 0-Adressar-
chitekturen aufgelistet, wie viele Einträge der darin realisierte Stapel aufnehmen
kann. Außerdem ist dargestellt, wie breit die Einträge, die in den Befehlen codierba-
ren unmittelbaren Operanden und die Befehle insgesamt minimal sind.
Tabelle 1.6. Registerspeichergrößen von Prozessoren mit 0-Adressarchitektur
Angaben zum Stapel
Bitbreite
Breite eines
Eintrags
unmittelbare
Operanden
kleinste
Befehle
Prozessor (Hersteller)
Stapeltiefe
18 ab
Ignite 1 (PTSC) [156]
32 Bit
4 - 32 Bit
8 Bit
64 b
picoJava-II (Sun) [177]
32 Bit
8 - 32 Bit
8 Bit
Transputer T9000 (Inmos) [84]
3
32 Bit
4 - 32 Bit
8 Bit
a. Der Prozessor verfügt über einen zweiten Stapel mit 16 Einträgen, in dem Rücksprungadres-
sen und lokale Variablen gespeichert werden können.
b. Der Stapel wird transparent im Hauptspeicher fortgesetzt und ist in seiner Kapazität daher nur
durch die Größe des verfügbaren Speichers begrenzt.
Beispiel 1.11. Codeerzeugung für 0-Adressarchitekturen . Ein Vorteil von 0-Adressarchitekturen
ist, dass die automatische Codeerzeugung einfacher ist als für andere Architekturformen. Der von
einem Übersetzer erzeugte Syntaxbaum muss hierzu ein einziges Mal tiefentraversiert werden,
wobei jeweils mit dem Aufstieg zu einem übergeordneten Knoten Maschinencode generiert wird.
In Tabelle 1.7 ist dies anhand eines arithmetischen Ausdrucks gezeigt. Der von einem Übersetzer
erzeugte Syntaxbaum ist in der zweiten Tabellenspalte dargestellt.
Die Tiefentraversierung beginnt mit der Wurzel (also oben) und durchläuft den Syntaxbaum von
links nach rechts. Zunächst besucht man den Zuweisungsknoten, von dem aus sich über den linken
Zweig das erste Blatt „&y“ erreichen lässt. (Das vorangestellte „&“ bewirkt, dass hier nicht der
Wert, sondern die Adresse der Variablen y verarbeitet wird. Dies entspricht der in C oder C++ übli-
chen Schreibweise). Da sich der Baum ausgehend von diesem Blatt nicht weiter in die Tiefe traver-
sieren lässt, kehrt man zum Wurzelknoten zurück und generiert den Befehl „pusha y“ (aufgelistet in
der dritten Tabellenspalte).
Als nächstes wird der rechte Zweig des Wurzelknotens traversiert, so über die Knoten „+“ und „*“
das Blatt a erreicht (hervorgehoben dargestellte Pfeile) und bei dessen Verlassen der Befehl „push
a“ erzeugt. In derselben Weise werden auch die Befehle zu den beiden mit x bezeichneten Blättern
generiert. Der erste Verknüpfungsbefehl „mul“ wird beim Verlassen des (im Syntaxbaum hervorge-
hoben dargestellten) Knotens „*“ zum darüberliegenden Knoten erzeugt. Mit ihm werden, bei einer
späteren Ausführung der Befehlsfolge, die auf dem Stapel erzeugten Inhalte x und x zu x 2 ver-
knüpft. Der Leser überzeuge sich davon, dass durch vollständige Tiefentraversierung des Syntax-
baums die in Spalte 3 der Tabelle 1.7 dargestellte Befehlsfolge entsteht.
Hierzu noch einige Anmerkungen: Der Inhalt der Variablen x wird insgesamt dreimal benötigt und
muss daher entsprechend oft geladen werden (im Syntaxbaum und im Maschinencode hervorgeho-
ben gesetzt). Dies ist von Nachteil, weil (1.) ggf. dreimal auf den Hauptspeicher zugegriffen und
(2.) die Adresse der Variablen x dreimal redundant im Programm codiert werden muss. Wird die
Search WWH ::




Custom Search