Zuweisung
st1(Linke Seite der Zuweisung):
Bezeichner global suchen
nicht gefunden -> Fehlerbehandlung
gefunden -> ok, weiter.
Bezeichnet der Bezeichner eine Variable?
Nein, eine Konstante oder Prozedur -> Fehlerbehandlung
ja -> ok , weiter
Codegenerierung :
Bezeichner gefunden |
Code |
Parameter |
---|---|---|
Local |
PushAdrVarLocal |
Relativadresse |
Im Hauptprogramm |
PushAdrVarMain |
Relativadresse |
In umgebender Prozedur |
PushAdrVarGlobal |
Relativadresse, Prozedurnummer |
st2 (Rechte Seite der Zuweisung):
Im Stack steht nun die Adresse der Zielvariable und der Wert des fertig berechneten Ausdrucks.
Codegenerierung : storval
if-Anweisung
st3 (if, nach Condition)
Generieren eines Labels, es zeigt auf den nächsten freien Speicherplatz des Codeausgabepuffers.
Codegenerierung jnot mit einer vorläufigen Relativadresse 0
st4 (if, nach Statement)
Label auskellern
Relativadresse berechnen
(Es ist hilfreich, sich hier die Arbeitsweise von jmp /jnot zu verdeutlichen. Die als Parameter des jmp-Befehls übergebene Relativadresse wird zum aktuellen Instructionpointer addiert und in den Instructionpointer geschrieben.
|
|
|
Relativadresse (11 bzw. 0xb) |
|
|
|
|
|
||||||||||
jnot |
xx |
xx |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
jnot-Befehl |
Bedingte Anweisung(-en) der if-Anweisung |
Folgende Anweisungen |
Die Relativadresse in der Skizze würde 11 (0xb) betragen
Relativadresse in jmp-Befehl eintragen, dazu den Labelwert um 1 erhöhen, wenn das Label auf den jmp-Befehl zeigt.
while-Anweisung
st5 (while)
Generieren eines Labels für Rücksprung am Schleifenende.
st6 (while, nach Condition)
Generieren eines Labels, es zeigt auf den nächsten freien Speicherplatz des Codeausgabepuffers.
Codegenerierung jnot mit einer vorläufigen Relativadresse 0
st7 (if, nach Statement)
Label auskellern
Relativadresse berechnen, so ähnlich, wie bei st4, jedoch müssen 3 Byte für den jmp-Befehl am Ende der while-Anweisung freihalten werden (zu der berechneneten Relativadresse muss die Länge des jmp-Befehls addiert werden addiert werden)
2. Labelauskellern und jmp-Befehl generieren. Die Relativadresse muss so berechnet werden, dass der Sprung bei dem 1. Befehl von Condition landet.
|
|
|
|
|
jnot |
xx |
xx |
|
|
|
|
|
|
|
|
jmp |
yy |
yy |
|
|
|
|
|
Condition |
jnot-Befehl |
Bedingte Anweisung(-en) der if-Anweisung |
Folgende Anweisungen |
call
st8 Prozeduraufruf
Bezeichner global suchen
nicht gefunden -> Fehlerbehandlung
gefunden -> ok, weiter.
Bezeichnet der Bezeichner eine Procedure?
Nein, eine Konstante oder Variable -> Fehlerbehandlung
ja ->
ok, weiter
Codegenerierung call procedurenummer
Eingabe
st9
Bezeichner global suchen
nicht gefunden -> Fehlerbehandlung
gefunden -> ok, weiter.
Bezeichnet der Bezeichner eine Variable?
Nein, eine Konstante oder Prozedur -> Fehlerbehandlung
ja -> ok, weiter,
Codegenerierung :
Bezeichner gfunden |
Code |
Parameter |
---|---|---|
Local |
PushAdrVarLocal |
Relativadresse |
Im Hauptprogramm |
PushAdrVarMain |
Relativadresse |
In umgebender Prozedur |
PushAdrVarGlobal |
Relativadresse, Prozedurnummer |
Codegenerierung getval
Ausgabe
Auszugebender Wert steht im Stack.
st10
Codegenerierung putval