4. Beispiel Programm

Beginnen wir mit der Formel

Beginnen wir mit dieser Formel und versuchen wir gemeinsam das zugehörige Programm zu entwickeln. 

O = 2*( l * b + (l+b) * h)

Dazu ist erst wichtig, festzustellen, dass wir in der Formel 4 Variable haben (O, l, b, h), für die wir Speicherplatz reservieren müssen. Wir nehmen dabei an, dass wir für jede dieser Variablen, wie auch für jeden dann zu schreibenden Befehl ein Speicherwort benötigen. Also reservieren wir dafür in dem für unser Programm vorgesehenen Speicherbereich

S1                                            Platz für O

S2                                            Platz für l

S3                                            Platz für b

S4                                            Platz für h 

Sodann stellen wir fest, dass wir wohl erst einmal die Werte für l, b und h von der Eingabeeinheit einlesen müssen. Also:

S5     LIES  s2                           lies l von Eingabeeinheit

S6     LIES  s3                           lies b von Eingabeeinheit

S7     LIES  s4                           lies h von Eingabeeinheit 

An dieser Stelle können wir festhalten, dass unser Programm nicht sehr benutzerfreundlich ist, da wir uns merken müssen, in welcher Reihenfolge l, b und h eingegeben werden müssen. Das soll uns momentan aber noch nicht sehr stören.  

Da wir nun die Daten dort haben, wo sie sein sollten, können wir nun mit der eigentlichen Berechnung beginnen.

S8     LADE s2, r1                     lade Wert von l in Register 1

S9     LADE s3, r2                     lade Wert von b in Register 2

S10 MULT r1, r2, r3                 führe auf die in Register 1 und Register 2 gespeicherten Werte eine Multiplikation aus und schreibe das Ergebnis nach Register 3 

Nun hängt es davon ab, wie viel Register unsere CPU hat ob wir die weiteren Werte in anderen noch freien Registern abspeichern können oder ob wir Zwischenergebnisse in den Speicher zurück schreiben und bei Bedarf frisch holen müssen. Wir nehmen an, wir hätten nur 3 Register, also müssen wir das Ergebnis der Multiplikation zurück schreiben. Dafür können wir die bisher noch unbenutzte Speicheradresse s1 verwenden. 

S11 SPEICHERE r3, s1             speichere das Zwischenergebnis l*b einstweilen in die Speicherzelle s1

Als nächstes kommt wohl die Addition (l+b) an die Reihe. Doch da wir die Werte von l und b bereits in Registern haben, müssen wir sie nicht holen, sondern können sofort addieren.

S12 ADD r1, r2, r3                    führe auf den noch immer in Register 1 und Register 2 gespeicherten Werten eine Addition aus und schreibe das Ergebnis nach Register 3

S13  LADE s4, r2                       lade den Wert von h in das nun nicht mehr benötigte Register 2

S14 MULT r3, r2, r1                   führe auf die in Register 3 (Zwischenergebnis des Klammerausdrucks) und Register 2 (Wert von h) gespeicherten Werte eine Multiplikation aus und schreibe das Ergebnis in das inzwischen nicht mehr benötigte Register 1

Wir haben somit in Register 1 den Flächeninhalt der Vorderseite und eines Seitenteile, also des halben Mantels stehen. Wir müssen nun noch den Flächeninhalt der Grundfläche, die wir zwischenzeitlich in Zelle s1 abgespeichert haben holen, addieren und die so erhaltene Fläche mit dem konstanten Wert 2 multiplizieren.

S15 LADE  s1, r2                                 lädt das in s1 abgespeicherte Zwischenergebnis in das inzwischen nicht mehr benötigte Register 1

S16  ADD r1, r2, r3                             addiert den in Register 1 gespeicherten Wert des halben Mantels zum eben in Register 2 geladenen Wert der Grundfläche. Somit steht nun der Wert der halben Oberfläche in Register 3

S17 MULT* r3, 2                                 Diese Multiplikation ist eigentlich ein neuer Befehl. Hier wird nicht mit einem in einer Variablen sondern mit der Konstanten „2“ multipliziert. Daher lautet der Befehlscode auch nicht MULT sondern MULT*. 

Speziell die Multiplikation mit 2 ist eine wichtige Spezialoperation, da sie im Binärsystem sehr einfach durch ein Left-Shift des jeweiligen Registerinhalts bewirkt werden kann.

 

S18 SPEICHERE r3, s1                     speichert das nunmehr in Register 3 enthaltene Endergebnis in die Zelle s1 
S19  SCHREIB s1                             gibt den in s1 enthaltenen Wert auf der Ausgabe aus.
S20 STOP                                        beendet dieses Programm

Wenn Zeit ist, ist es sicherlich hilfreich hier die Frage zu provozieren, warum der Wert aus Register 3 erst noch nach Arbeitsspeicherzelle s1 geschrieben werden musste, bevor er ausgegeben werden konnte. 

Die Antwort liegt in der unterschiedlichen Geschwindigkeit der Geräte. Ein-/Ausgabe ist langsam und erfolgt daher stets indirekt über den Arbeitsspeicher.