![]() |
|||
HSG |
|
Es stellt sich heraus, dass die scheinbar einfache Zuweisung b := a bereits einiges impliziert:
2. Informelle Beschreibung des AlgorithmusVier while-Schleifen !
|
![]() |
3. Delphi-Tests
|
Beim Drücken des Buttons "Programm 1" wird folgende Ereignisbehandlungsroutine ausgelöst:
procedure TForm1.bProgramm1Click(Sender: TObject); var a,b,h : word; begin a := StrToInt(eA.Text); b := StrToInt(eB.Text); h := StrToInt(eH.Text); b := a; eAn.Text := IntToStr(a); eBn.Text := IntToStr(b); eHn.Text := IntToStr(h); end;
Verwendet man nur noch while-Schleifen und inc- und dec-Befehle, so kommt man Bonsai-Assembler schon näher. Inc und Dec sind direkt übersetzbar und für die while-Schleife haben wir schon eine Schablone. Im Folgendem ist nur noch der Verarbeitungsteil von "Programm 2" angegeben.
while h > 0 do dec(h); while b > 0 do dec(b); while a > 0 do begin dec(a); inc(b); inc(h); end; while h > 0 do begin dec(h); inc(a); end;
Jetzt werden die while-Schleifen systematisch übersetzt. Man wird sich Schleife für Schleife vornehmen und den auskommentierten Quelltext sozusagen als "Plan" zunächst stehen lassen. Es ist nicht unbedingt übertrieben vorsichtig, nach jeder übersetzten Schleife einen Testlauf einzufügen.
{while h > 0 do dec(h);} SB1: if h > 0 then goto SK1 else goto SE1; SK1: dec(h); goto SB1; SE1: {while b > 0 do dec(b);} SB2: if b > 0 then goto SK2 else goto SE2; SK2: dec(b); goto SB2; SE2: {while a > 0 do begin dec(a); inc(b); inc(h); end;} SB3: if a > 0 then goto SK3 else goto SE3; SK3: dec(a); inc(b); inc(h); goto SB3; SE3: {while h > 0 do begin dec(h); inc(a); end;} SB4: if h > 0 then goto SK4 else goto SE4; SK4: dec(h); inc(a); goto SB4; SE4:
Die 4. und letzte Version stimmt mit der 3.Version im Quelltext völlig überein. Nur dass hier die auskommentierten while-Anweisungen gelöscht und durch eine "Spaltenanordnung" der Befehle die Übersetzung in Bonsai-Assembler vorbereitet ist.
SB1: if h > 0 then goto SK1 else goto SE1; SK1: dec(h); goto SB1; SE1: SB2: if b > 0 then goto SK2 else goto SE2; SK2: dec(b); goto SB2; SE2: SB3: if a > 0 then goto SK3 else goto SE3; SK3: dec(a); inc(b); inc(h); goto SB3; SE3: SB4: if h > 0 then goto SK4 else goto SE4; SK4: dec(h); inc(a); goto SB4; SE4:
Um die Übersetzung abzuschließen, müssen wir drei Dinge tun:
Los geht's!
Wir ordnen zu: a = r1, b = r2, h = r3.
Jetzt ersetzen wir die Hochsprachenbefehle durch Assembler-Befehle und nummerieren die Zeilen. Dabei wird an den Nahtstellen der Schleifen ein Befehl mit zwei Labeln bezeichnet. Oder anders herum: Pro Befehl eine Zeile. Nach der Übersetzung ist durch die Nummerierung eine Übersetzungstabelle Nummer - Label enstanden. Anhand dieser Tabelle werden abschließend die symbolischen Labels durch Nummern ersetzt, das Assembler-Programm ist nun fertig.
|
|
Dieses Programm läßt sich nun im Simulationsprogramm auf seine Korrektheit testen.
Aber was soll bei so viel Gründlichkeit noch schiefgehen?
Ein Test mit a=4, b=2 und h=3 war erfolgreich!
Übersetze systematisch b := b + a.