Index

Aufbau und Prinzipien der Arbeitsweise des Rechners

2. Untersuchung einfacher Programmstrukturen


[Zuweisungsoperationen] [Terme] [Verzweigungen] [Wiederholungen]

Zuweisungsoperationen

Im ersten Schritt wollen wir Zuweisungen von Werten an Variablen untersuchen. Hier wie auch bei den folgenden Untersuchungen verwenden wir einfache Delphi-Programme. Die eigentlichen Programmroutine legen wir auf einen Butten "Start" zur Ausführung. In der Klickprozedur dieses Buttons deklarieren wir die nötigen Variablen und hinterlegen den Programmcode.

Programm-GUI

Hinweis: Damit der Compiler die Variablen überhaupt anlegt, müssen diese in einer Anweisung benutzt werden. Aus diesem Grund fügen wir eine Ausgabeanweisung für die Variable(n) ein.
Zum Studieren des Codes benutzen wir das CPU-Fenster, das geöffnet werden kann, wenn das Program im Debugmodus läuft. Daher setzen wir in der Zeile der ersten zu untersuchenden Anweisung einen Haltepunkt. Hierzu muss in den Randbereich links vor der Zeile geklickt werden.

Das folgende Bild zeigt die Klickprozedur für eine Zuweisung einer Konstanten (hier 20) an eine Variable (hier a) mit gesetztem Haltepunkt.

Programm Zuweisung 1

Nach dem Starten hält das Programm am Haltepunkt an und wir öffnen das CPU-Fenster (Ansicht/Debugfenster/CPU bzw. Strg-Alt-C):

CPU-Fenster mit Programm Zuweisung 1

Der Bereich links oben zeigt den aktuellen Programmausschnitt im Hauptspeicher (Adresse hexadezimalen Maschinencode und die Übersetzung in Assemblercode),
unten links wird der Maschinencode fortlaufen hexadezimal angezeigt (Adresse in 8-er Schritten 8 Byte Code).
Im rechten Bereich werden die Prozessorregister EAX (= extendedAX) bis EFL, je 32 Bit (= 4 Byte groß) sowie CS bis GS (je 2 Byte groß) dargestellt.
In der rechten Spalte finden wir so genannte Flags (CF bis ID).
Der Bereich unten rechts zeigt einen Ausschnitt des Hauptspeichers im Datenbereich (Stack) (Adresse Inhalt (4 Byte groß)).

Blau hinterlegt wird die aktuelle Position im Programmcode dargestellt. Wir erkennen die auszuführende Pascalanweisung a := 20; der grüne Pfeil markiert den zugehörigen Maschinencode, der als nächstes ausgeführt wird.
Assemblercode: mov esi,$00000014
Bedeutung: Bewege nach (move) Register ESI die HexZahl ($) 00000014 = 20dez.
Maschinencode: BE14000000. BE ist der Code für mov esi, die 14 stellt die Zahlkonstante dar.
Der Assemblercode ermöglicht uns eine leichtere Lesbarkeit. Man müsste sonst z.B. die Bedeutung des Codes BE wissen.

Führt man nun über den Einzelschrittmodus in Delphi (F7) den Programmschritt aus, so erhält man folgendes CPU-Fenster:

CPU-Fenster mit Programm Zuweisung 1 nach erfolgter Zuweisung

Links wurde die nächste Anweisung ausgewählt.
Interessant ist aber der Registerbereich. Das Register ESI enthält nun tatsächlich den Wert 00000014. (Rot dargestellt)

Die folgenden Anweisungen betreffen nun die Aufbereitung und Ausgabe des Ergebnisses über das Label. Diesen Code zu verfolgen würde hier zu weit führen.

Weitere Beispiele untersuchen wir in Übungen:

  1. Übung:
    1. Benennen Sie die Variable a in p um und ändern Sie die Wertzuweisung und die Ausgabe entsprechend.
    2. Fügen Sie eine integer-Variable q und die Anweisung q := 10 sowie eine weitere Ausgabeanweisung lbAusgabe1.Caption := IntToStr(q) hinzu.
    3. Fügen Sie eine dritte integer-Variable r und die Anweisung r := 2 und die entsprechende Ausgabeanweisung hinzu.
    4. Erweitern Sie das Programm um eine vierte Variable s mit einer Wertzuweisung und Ausgabe.
  2. Übung:
    Ändern Sie die erste Wertzuweisung des Programms in p := 0. Beschreiben Sie, wie diese Wertzuweisung im Assemblercode realisiert wird.
  3. Übung:
    Ändern Sie die erste Wertzuweisung des Programms in p := -2. Beschreiben Sie, wie negative Zahlen hexadezimal realisiert werden.
  4. Übung:
    Verwenden Sie für die Zuweisung auch große Zahlen, z.B. 305.419.896. Wie wird diese Zahl im Maschinencode kodiert?

Als Ergebnisse der Zuweisungen können wir festhalten, dass

Bei der Verwendung großer Zahlen erkennt man, dass Zahlen im Speicher byteweise in der Reihenfolge von niederwertigen zu höherwertigen Stellen eingetragen werden. Die Zahl 305.419.896dez = 12.34.56.78hex steht im Speicher in der Reihenfolge 78.56.34.12.


[Terme] [Verzweigungen] [Wiederholungen]

[Index] [Einführung] [Logische Schaltelemente - CPU]


Autor: Jürgen Dehmer
Letzte Änderung: 28.02.2004