Ausführung eines Programms durch die CPU

Ein Programm ist eine Abfolge von Anweisungen in einer Programmiersprache. Mit diesem Programm soll auf einem Computer (Mikrocontroller) ein bestimmtes Problem gelöst werden. Das Programm ist üblicherweise als Datei gespeichert. Das Programm muss zunächst in Maschinensprache übersetzt werden. Diesen Maschinencode versteht der Computer und kann ihn ausführen.

Um ein Programm ausführen zu können muss der Computer den Maschinencode in seinen Programmspeicher (Hauptspeicher) laden. Erst dann kann er die Maschinenbefehle, aus denen das Programm besteht, nacheinander ausführen.

Prozesse

Ein Programm, das vom Computer gerade ausgeführt wird, bezeichnet man als Prozess (Task).
Zu einem Prozess gehören neben dem Programmcode im Programmspeicher auch auch die Daten, die diesem Prozess zugeordnet sind. Diese werden im Datenspeicher (Hauptspeicher) abgelegt. Dazu muss dem Prozess ein bestimmter Speicherbereich reserviert werden.

Prozessorganisation

Auf einem Computersystem übernimmt das Betriebssystem die Organisation der Prozesse.
Auf einem Mikrocontroller ist meistens kein Betriebssystem installiert. Der Benutzer ist also selbst dafür verantwortlich, die Organisation des Prozesses zu übernehmen.
Die Prozess-Organisation besteht aus folgenden wesentlichen Punkten:

  • Laden des Maschinencodes in einen freien Speicherbereich.
  • Reservieren des Speicherbereichs für den Programmcode.
  • Reservieren eines ausreichend großen Speicherbereichs für die Daten (Datenspeicher).
  • Starten des Prozesses
  • Organisation des Programm- und Datenspeichers während der Laufzeit: Daten und Programmcode dürfen sich nicht gegenseitig beeinträchtigen. Speicherzugriffsfehler müssen ausgeschlossen werden.

Starten eines Programms

Um ein Programm zu starten, muss die CPU den Program-Counter auf die Speicherstelle des ersten Befehls des Programms stellen. Die dort vorhandenen Befehle werden dann nacheinander ausgeführt.

Sprünge innerhalb eines Programms

Sprünge in einem Programm werden oft benötigt, beispielsweise bei Schleifen.
Meistens handelt es sich dabei um bedingte Sprünge. Diese werden nur dann ausgeführt, wenn eine bestimmte (logische) Bedingung gegeben ist. Die Möglichkeit, bedingte Sprünge ausführen zu können, ist grundlegend für die Turingmächtigkeit eines Computers.
Bei einem Sprung wird der Stand des Program-Counters von der CPU gezielt verändert. Nach der Veränderung zeigt er auf die Speicherstelle im Programmspeicher an der das Programm fortfahren soll (Sprungziel).

Unterfunktionen eines Programms

Beim Ausführen einer (Unter-) Funktion wird in einer bestimmten Stelle des Programmcodes zu einer anderen Stelle im Programmcode gesprungen, wo der Programmcode der Funktion gespeichert ist. Dort wird der Programmcode fortgeführt. Ist die Funktion abgearbeitet wird wieder zurück an den Ausgangspunkt gesprungen. Dieser Ausgangspunkt muss natürlich zwischengespeichert werden. Dies geschieht üblicherweise auf dem Stack.

  1. Sichern des Programmzählers auf dem Stack
  2. Sprung an die Adresse der Unterfunktion (dabei wird der Programmzähler verändert)
  3. Ausführen der Unterfunktion
  4. Rücksprung an die Ausgangsadresse. (dabei wird der Programmzähler vom Stack genommen und der gespeicherte Wert wiederhergestellt)