2.2.1 Vom Quellcode zum Prozessor

[gesichtete Version][gesichtete Version]
Keine Bearbeitungszusammenfassung
 
(55 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Hier sieht man den Quellcode eines ganz einfachen Programms, jeweils in den Hochsprachen Java, C und Pascal:
 
<loop_area type="sourcecode">'''Quellcode in Java:'''<br />
<p>
<br />public class Addierer {<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x = 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int y = 5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int z = x + y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
Hier sieht man den <loop_index id="5fa97885d4cc2">Quellcode</loop_index>Quellcode eines ganz einfachen <loop_index id="5fa97885d4cd0">Programm</loop_index>Programms, jeweils in den <loop_index id="5fa97885d4cdb">Hochsprache</loop_index>Hochsprachen <loop_index id="5fa97885d4ce5">Java, Hochsprache</loop_index>Java, <loop_index id="5fa97885d4cef">C, Hochsprache</loop_index>C und <loop_index id="5fa97885d4cfa">Pascal, Hochsprache</loop_index>Pascal:
</p>
 
<br />
== Quellcode in Java ==
<p>
<loop_area type="sourcecode">
<p>
<span style="font-family:Courier">
public class Addierer {<br />&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x = 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int y = 5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int z = x + y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}
</span>
</p>
<hr>
<p>
<small>'''Listing 1: Java'''</small>
</p>
</loop_area>
</loop_area>
<loop_area type="sourcecode">'''Quellcode in C:'''<br />
</p>
<br />void main(void) {<br />&nbsp;&nbsp;&nbsp;&nbsp;int x = 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;int y = 5;<br />&nbsp;&nbsp;&nbsp;&nbsp;int z = x + y;<br />}<br />
 
<br />
 
== Quellcode in C ==
<p>
<loop_area type="sourcecode">
<p>
<span style="font-family:Courier">
void main(void) {<br />&nbsp;&nbsp;&nbsp;&nbsp;int x = 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;int y = 5;<br />&nbsp;&nbsp;&nbsp;&nbsp;int z = x + y;<br />}<br />
</span>
</p>
<hr>
<p>
<small>'''Listing 2: C'''</small>
</p>
</loop_area>
</loop_area>
<loop_area type="sourcecode">'''Quellcode in Pascal:'''<br />
</p>
<br />PROGRAM Addierer;<br />VAR<br />&nbsp;&nbsp;&nbsp;&nbsp;x, y, z: Integer<br />BEGIN<br />&nbsp;&nbsp;&nbsp;&nbsp;x := 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;y := 5;<br />&nbsp;&nbsp;&nbsp;&nbsp;z := x + y;<br />END.<br />
 
<br />
== Quellcode in Pascal ==
<p>
<loop_area type="sourcecode">
<p>
<span style="font-family:Courier">
PROGRAM Addierer;<br />VAR<br />&nbsp;&nbsp;&nbsp;&nbsp;x, y, z: Integer<br />BEGIN<br />&nbsp;&nbsp;&nbsp;&nbsp;x := 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;y := 5;<br />&nbsp;&nbsp;&nbsp;&nbsp;z := x + y;<br />END.
</span>
</p>
<hr>
<p>
<small>'''Listing 3: Pascal'''</small>
</p>
</loop_area>
</loop_area>
</p>
<br />
<p>
Dieses Programm ist sehr einfach zu verstehen:
Dieses Programm ist sehr einfach zu verstehen:
* Es werden drei Variablen deklariert.
* Es werden drei Variablen deklariert.
* Der ersten Variablen x wird der Wert 2 zugewiesen.
* Der ersten Variablen x wird der Wert 2 zugewiesen.
* Der zweiten Variablen y wird der Wert 5 zugewiesen.
* Der zweiten Variablen y wird der Wert 5 zugewiesen.
* Die dritte Variable z bekommt ihren Wert zugewiesen als Ergebnis der Addition der Werte der Varaiablen x und y.
* Die dritte Variable z bekommt ihren Wert zugewiesen als Ergebnis der Addition der Werte der Variablen x und y.
In C oder Pascal wird nun der Compiler auf den Quellcode angesetzt und heraus kommt eine ausführbare Datei. Bei dem Java-Quelltext sieht es etwas anders aus, da hier der Compiler nicht direkt eine ausführbare Datei erzeugt, sondern zunächst nur eine Datei mit sogenannten Bytecode, der später interpretiert wird. Wir beschränken uns in der weiteren Betrachtung auf die direkt vom Compiler erzeugte ausführbare Datei.
</p>
 
<p>
In C oder Pascal wird nun der <loop_index id="5fa97885d4d04">Compiler</loop_index>Compiler auf den Quellcode angesetzt und heraus kommt eine ausführbare Datei. Bei dem Java-Quelltext sieht es etwas anders aus, da hier der Compiler nicht direkt eine <loop_index id="5fa97885d4d0e">ausführbare Datei</loop_index><loop_index id="5fa97886958d6">Datei, ausführbar</loop_index>ausführbare Datei erzeugt, sondern zunächst nur eine Datei mit sogenannten <loop_index id="5fa97885d4d18">Bytecode</loop_index>Bytecode, der später interpretiert wird. Wir beschränken uns in der weiteren Betrachtung auf die direkt vom Compiler erzeugte ausführbare Datei.
</p>


Nach dem Start der ausführbaren Datei wird der sogenannte Programmtext in den Hauptspeicher ([[Speicherwerk]]) geladen. Der Programmtext enthält die tatsächlich von der CPU ausführbaren Befehle, es handelt sich um die sogenannte Maschinensprache.
<p>
<loop_area type="sourcecode">'''Quelltext übersetzt in Maschinensprache (Programmtext):'''<br /><br />
Nach dem Start der ausführbaren Datei wird der sogenannte <loop_index id="5fa97885d4d22">Programmtext</loop_index>Programmtext in den <loop_index id="5fa97885d4d2c">Hauptspeicher</loop_index>Hauptspeicher ([[Speicherwerk]]) geladen. Der Programmtext enthält die tatsächlich von der CPU ausführbaren Befehle, es handelt sich um die sogenannte <loop_index id="5fa97885d4d37">Maschinensprache</loop_index>Maschinensprache.
</p>
 
<br />
 
== Definition: Maschinensprache ==
<p>
<loop_index id="5fa97885d4d40">Maschinencode</loop_index>
<loop_area type="definition">
<p>
Unter '''Maschinensprache''' oder '''Maschinencode''' versteht man eine Folge von Einsen und Nullen, die einen oder mehrere Befehle repräsentieren, die auf einer CPU ausgeführt werden können.
</p>
</loop_area>
</p>
 
<p>
Unterschiedliche CPUs unterstützen üblicherweise eine unterschiedliche Anzahl an Befehlen, auch die Notation von evtl. gleichbedeutenden Befehlen kann bei unterschiedlichen CPUs variieren.
</p>
 
<br />
 
== Beispiel Maschinencode ==
<p>
Hier sieht man ein <loop_index id="5fa97885d4d4a">Beispiel, Maschinencode</loop_index>Beispiel für Maschinencode:
</p>
 
<p>
<loop_area type="sourcecode">
<p>
<span style="font-family:Courier">
0000000011000010000000010000110100000000110001010000000100001110000000 0010001101000000011000111000000001000011110000001110000000
0000000011000010000000010000110100000000110001010000000100001110000000 0010001101000000011000111000000001000011110000001110000000
</span>
</p>
<hr />
<p>
<small>'''Listing 4: Maschinencode (Programmtext)'''</small>
</p></loop_area>
</p>
<p>
Und an genau dieser Stelle beginnen die Probleme für den Menschen. Eine sehr lange Reihe von Einsen und Nullen ist nicht wirklich dafür geeignet, dass der Mensch sie problemlos versteht.
</p>
<p>
Das folgende Video bringt etwas Licht ins Dunkel und erläutert die Bedeutung dieser Reihe.
</p>
<p>
<loop_area icon="Video.png" icontext="Video">
<loop_media type="video" title="Vom Quellcode zum Prozessor (14:09)" description="http://youtu.be/cX5XLc9e_g4" copyright="CC-BY" index=true show_copyright=true id="5fa97885d4d54">{{#ev:youtube|cX5XLc9e_g4|700}}</loop_media>
</loop_area>
</loop_area>
Und an genau dieser Stelle beginnen die Probleme für den Menschen. Eine sehr lange Reihe von Einsen und Nullen ist nicht wirklich dafür geeignet, dass der Mensch sie problemlos versteht. Das folgende Video bringt etwas Licht ins Dunkel und erläutert die Bedeutung dieser Reihe.
</p>
<p><loop_media type="video" title="Vom Quellcode zum Prozessor (14:09)" description="http://youtu.be/cX5XLc9e_g4" copyright="CC-BY" index=true show_copyright=true>{{#ev:youtube|cX5XLc9e_g4}}</loop_media></p>
 
Am Ende des Videos wird auf eine SWF-Animation verweisen. Das Bearbeiten der Animation stellt eine sinnvolle Fortsetzung des Videos dar und sei deshalb empfohlen.
<br />
<loop_area type="task">'''Aufgabe 1'''<br />Bearbeite die SWF-Animation unter<br />http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/sumprogram.html <br />und vertiefe damit das Verständnis für die Ausführung von Maschinensprache auf einer CPU. Die Animation kann sowohl für den Ablauf mit Maschinensprache, als auch mit Assembler konfiguriert werden. Bedenke, dass Assembler nur eine Vereinfachung für den Menschen darstellt. Auf der CPU werden immer binär codierte Befehle (--> Maschinensprache) ausgeführt.<br /> <br />Falls dein Gerät die SWF-Wiedergabe nicht unterstützt, findest du hier ein aufgenommenes Video der Animation:<br />[http://youtu.be/_HwoiEkW8nI Sum program (Assembler) --> http://youtu.be/_HwoiEkW8nI] (03:33)<br />[http://youtu.be/i2sREE1aAOc Sum program (Maschinensprache) --> http://youtu.be/i2sREE1aAOc] (03:23)<br />Diese Videos sind ohne Ton aufgezeichnet.</loop_area>
<p>
Am Ende des Videos wird auf eine SWF-Animation verwiesen. Das Bearbeiten der Animation stellt eine sinnvolle Fortsetzung des Videos dar, weshalb die folgende Aufgabe dieses aufgreift.
</p>


Die oben gezeigte Reihe aus Einsen und Nullen besteht in diesem Beispiel also aus insgesamt acht Befehlen, von denen jeder aus genau 16 Bit besteht.
<br />
<loop_area type="sourcecode">'''8 Maschinensprachebefehle, bestehend aus je 16 Bit:'''<br />
 
<br />0000000011000010<br />0000000100001101<br />0000000011000101<br />0000000100001110<br />0000000010001101<br />0000000110001110<br />0000000100001111<br />0000001110000000
== Aufgabe 1 ==
<p>
<loop_index id="5fa97885d4d5d">Sum program</loop_index><loop_index id="5fa97885d4d67">Assembler</loop_index><loop_index id="5fa97885d4d71">Maschinensprache</loop_index>
<loop_area type="task">
<loop_task title="Sum Program" id="5fa97885d4d7b">
<p>
Bearbeite die SWF-Animation unter<br /><del>http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/sumprogram.html</del> <br />und vertiefe damit das Verständnis für die Ausführung von Maschinensprache auf einer CPU. <br /><small>(Leider ist der hier angegebene Link nicht mehr verfügbar. Bitte verwende stattdessen die auf YouTube bereitgestellten Videos mit der Aufzeichnung der Animation:)</small>
</p>
<p>
[http://youtu.be/_HwoiEkW8nI Sum program (Assembler) --> http://youtu.be/_HwoiEkW8nI] (03:33)<br />[http://youtu.be/i2sREE1aAOc Sum program (Maschinensprache) --> http://youtu.be/i2sREE1aAOc] (03:23)<br /><small>Diese Videos sind ohne Ton aufgezeichnet.</small>
</p>
<p>
Die aufgezeichnete Animation steht sowohl für den Ablauf mit Maschinensprache, als auch mit Assembler zur Verfügung. Bedenke, dass Assembler nur eine Vereinfachung für den Menschen darstellt. Auf der CPU werden immer binär codierte Befehle (--> Maschinensprache) ausgeführt.
</p>
</loop_task>
</loop_area>
</loop_area>
</p>
<br />
== Befehle in Maschinencode ==
<p>
Die [[Vom_Quellcode_zum_Prozessor#Beispiel_Maschinencode|oben]] gezeigte Reihe aus Einsen und Nullen besteht in diesem Beispiel also aus insgesamt acht Befehlen, von denen jeder aus genau 16 Bit besteht.
</p>
<p>
<loop_area type="sourcecode">
<p>
<span style="font-family:Courier">
0000000011000010<br />0000000100001101<br />0000000011000101<br />0000000100001110<br />0000000010001101<br />0000000110001110<br />0000000100001111<br />0000001110000000
</span>
</p>
<hr>
<p>
<small>'''Listing 5: Acht Maschinensprachebefehle, bestehend aus je 16 Bit'''</small>
</p>
</loop_area>
</p>
<br />
== Assemblercode ==
<p>
Diese Maschinensprachebefehle lassen sich für Menschen besser als Assemblercode darstellen:
Diese Maschinensprachebefehle lassen sich für Menschen besser als Assemblercode darstellen:
<loop_area type="sourcecode">'''Übersetzt in Assembler:'''<br />
</p>
<br />LOAD #2<br />STORE 13<br />LOAD #5<br />STORE 14<br />LOAD 13<br />ADD 14<br />STORE 15<br />HALT<br />
 
<p>
<loop_area type="sourcecode">
<p>
<span style="font-family:Courier">
LOAD #2<br />STORE 13<br />LOAD #5<br />STORE 14<br />LOAD 13<br />ADD 14<br />STORE 15<br />HALT
</span>
</p>
<hr>
<p>
<small>'''Listing 6: Assembler'''</small>
</p>
</loop_area>
</loop_area>
</p>
<br />
<p>
Wie die verschiedenen auf dieser Seite angegebenen Videos zeigen, ist anhand des Assemblercodes sehr leicht nachvollziehbar, dass der Programmtext auf der betrachteten Beispiel-CPU tatsächlich eine Übersetzung des oben auf dieser Seite gegebenen Quellcodes in einer der Hochsprachen ist.
Wie die verschiedenen auf dieser Seite angegebenen Videos zeigen, ist anhand des Assemblercodes sehr leicht nachvollziehbar, dass der Programmtext auf der betrachteten Beispiel-CPU tatsächlich eine Übersetzung des oben auf dieser Seite gegebenen Quellcodes in einer der Hochsprachen ist.
</p>
<br />
<p>
<loop_area type="notice">'''Hinweis'''
<p>
Der hier verwendete Begriff ''Assembler'' wird beispielhaft anhand einiger sehr einfach gehaltener Befehle erläutert. Es soll an dieser Stelle darauf hingewiesen werden, dass es für jeden Computertyp eine spezielle, auf den Befehlssatz des Prozessors zugeschnittene Assemblersprache gibt.
</p>
<p>
Eine tiefergehende Auseinandersetzung mit Assembler soll an dieser Stelle nicht erfolgen. Bei Bedarf können [http://de.wikipedia.org/wiki/Assemblersprache weitere Hintergründe zu Assemblersprachen in einem gleichnamigen Wikipedia-Artikel nachgelesen werden.]
</p>
<p>
In diesem Zusammenhang veranschaulicht die verlinkte [http://de.wikipedia.org/wiki/Liste_von_Hallo-Welt-Programmen/Assembler Auflistung von ''Hallo-Welt-Programmen'' in verschiedenen Assemblersprachen] deutliche Unterschiede.
</p>
</loop_area>
</p>
<br />
<p>
Ein paar zusätzliche Aufgaben sollen das Thema noch vertiefen.
</p>


Ein paar zusätzliche Aufgaben sollen das zuvor erläuterte Beispiel noch vertiefen.
<br />
<loop_area type="task">'''Aufgabe 2'''<br />
== Aufgabe 2 ==
Betrachte folgende Internet-Seite, auf der ganz unten das ''Count program'' mit SWF-Animation zu finden ist:<br />http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/Lesson.html<br />Starte die SWF-Animation zum ''Count program'' und beobachte den Ablauf.<br /><br />Falls dein Gerät die SWF-Wiedergabe nicht unterstützt, findest du hier ein aufgenommenes Video der Animation:<br />[http://youtu.be/IwjR83896p0 Count program (Assembler) --> http://youtu.be/IwjR83896p0] (09:37)<br />[http://youtu.be/zIDj4FlOV7U Count program (Maschinensprache) --> http://youtu.be/zIDj4FlOV7U] (09:32)<br />Diese Videos sind ohne Ton aufgezeichnet.
<p>
<loop_index id="5fa97885d4d85">Count program</loop_index>
<loop_area type="task">
<loop_task title="Count Program" id="5fa97885d4d8e">
<p>
Betrachte folgende Internet-Seite, auf der ganz unten das ''Count program'' mit SWF-Animation zu finden ist. Starte die SWF-Animation zum ''Count program'' und beobachte den Ablauf.<br /><del>http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/Lesson.html</del><br /><small>(Leider ist der hier angegebene Link nicht mehr verfügbar. Bitte verwende stattdessen die auf YouTube bereitgestellten Videos mit der Aufzeichnung der Animation:)</small>
</p>
<p>
[http://youtu.be/IwjR83896p0 Count program (Assembler) --> http://youtu.be/IwjR83896p0] (09:37)<br />[http://youtu.be/zIDj4FlOV7U Count program (Maschinensprache) --> http://youtu.be/zIDj4FlOV7U] (09:32)<br /><small>Diese Videos sind ohne Ton aufgezeichnet.</small>
</p>
</loop_task>
</loop_area>
</loop_area>
<loop_area type="task">'''Aufgabe 3'''<br />
</p>
 
<br />
 
== Aufgabe 3 ==
<p id="Aufgabe 3: EQUAL-Befehl">
<loop_area type="task">
<loop_task title="EQUAL-Befehl" id="5fa97885d4d97">
<p>
Wie funktioniert der im ''Count program'' enthaltene EQUAL-Befehl?
Wie funktioniert der im ''Count program'' enthaltene EQUAL-Befehl?
</p>
</loop_task>
</loop_area>
</loop_area>
<loop_area type="task">'''Aufgabe 4'''<br />
</p>
 
<br />
== Aufgabe 4 ==
<p id="Aufgabe 4: JUMP-Befehl">
<loop_area type="task">
<loop_task title="JUMP-Befehl" id="5fa97885d4da0">
<p>
Wie funktioniert der im ''Count program'' enthaltene JUMP-Befehl?<br />Arbeitet JUMP auch auf dem Akkumulator?
Wie funktioniert der im ''Count program'' enthaltene JUMP-Befehl?<br />Arbeitet JUMP auch auf dem Akkumulator?
</p>
</loop_task>
</loop_area>
</p>
<br />
== Aufgabe 5 ==
<p id="Aufgabe 5: Assembler-2-Hochsprache">
<loop_area type="task">
<loop_task title="Assembler-2-Hochsprache" id="5fa97885d4daa">
<p>
Der Assemblercode des ''Count program'' sieht wie folgt aus:
</p>
<p>
<span style="font-family:Courier">
LOAD #5<br />STORE 15<br />LOAD #0<br />EQUAL 15<br />JUMP #6<br />HALT<br />ADD #1<br />JUMP #3
</span>
</p>
<p>
Erarbeite einen Vorschlag für ein äquivalentes Programm in einer Hochsprache wie Java, C, Pascal oder ähnlich. Diskutiere deinen Vorschlag in deiner Lerngruppe! (Keine Idee? Dann frag in deiner Lerngruppe mal nach einem Tipp!)
</p>
</loop_task>
</loop_area>
</loop_area>
<loop_area type="task">'''Aufgabe 5'''<br />
</p>
Der Assemblercode des ''Count program'' sieht wie folgt aus:<br />LOAD #5<br />
 
STORE 15<br />LOAD #0<br />EQUAL 15<br />JUMP #6<br />HALT<br />ADD #1<br />JUMP #3<br />
<br />
<br />Erarbeite einen Vorschlag für ein äquivalentes Programm in einer Hochsprache wie Java, C, Pascal oder ähnlich. Diskutiere deinen Vorschlag in deiner Lerngruppe! (Keine Idee? Dann frag in deiner Lerngruppe mal nach einem Tipp!)
== Aufgabe 6 ==
</loop_area><loop_area type="task">'''Aufgabe 6'''<br />
<p>
<loop_area type="task">
<loop_task title="Speicherzellen für die Befehle" id="5fa97885d4db4">
<p>
Weise jedem Assembler-Befehl aus der vorangegangenen Aufgabe eine Speicherzelle in der folgenden Abbildung des Speicherwerks zu.
Weise jedem Assembler-Befehl aus der vorangegangenen Aufgabe eine Speicherzelle in der folgenden Abbildung des Speicherwerks zu.
* Ist das Assembler-Programm so noch lauffähig?
* Ist das Assembler-Programm so noch lauffähig?
* Erkläre den anderen Mitgliedern deiner Lerngruppe den Ablauf im Zusammenspiel zwischen CPU und Speicherwerk!
* Erkläre den anderen Mitgliedern deiner Lerngruppe den Ablauf im Zusammenspiel zwischen CPU und Speicherwerk!
<p><loop_figure title="" description="" copyright="CC-BY" index=true show_copyright=true>[[Datei:Cpu9-speicher.jpg|650px]]</loop_figure></p>
</p>
<p>
<loop_figure title="Abbildung zu Aufgabe 6" description="" copyright="CC-BY" index=true show_copyright=true id="5fa97885d4dbe">[[Datei:Cpu9-speicher.jpg|650px]]</loop_figure></p>
</loop_task>
</loop_area>
</loop_area>
<br />
</p>
<br />
<hr />
<sub>Diese Seite steht unter der [http://creativecommons.org/licenses/by/3.0/deed.de Creative Commons Namensnennung 3.0 Unported Lizenz] [http://creativecommons.org/licenses/by/3.0/deed.de http://i.creativecommons.org/l/by/3.0/80x15.png]
</sub>

Aktuelle Version vom 23. September 2024, 09:14 Uhr

Hier sieht man den Quellcode eines ganz einfachen Programms, jeweils in den Hochsprachen Java, C und Pascal:


Quellcode in Java

Code

public class Addierer {
    public static void main(String[] args) {
        int x = 2;
        int y = 5;
        int z = x + y;
    }
}


Listing 1: Java


Quellcode in C

Code

void main(void) {
    int x = 2;
    int y = 5;
    int z = x + y;
}


Listing 2: C


Quellcode in Pascal

Code

PROGRAM Addierer;
VAR
    x, y, z: Integer
BEGIN
    x := 2;
    y := 5;
    z := x + y;
END.


Listing 3: Pascal


Dieses Programm ist sehr einfach zu verstehen:

  • Es werden drei Variablen deklariert.
  • Der ersten Variablen x wird der Wert 2 zugewiesen.
  • Der zweiten Variablen y wird der Wert 5 zugewiesen.
  • Die dritte Variable z bekommt ihren Wert zugewiesen als Ergebnis der Addition der Werte der Variablen x und y.

In C oder Pascal wird nun der Compiler auf den Quellcode angesetzt und heraus kommt eine ausführbare Datei. Bei dem Java-Quelltext sieht es etwas anders aus, da hier der Compiler nicht direkt eine ausführbare Datei erzeugt, sondern zunächst nur eine Datei mit sogenannten Bytecode, der später interpretiert wird. Wir beschränken uns in der weiteren Betrachtung auf die direkt vom Compiler erzeugte ausführbare Datei.

Nach dem Start der ausführbaren Datei wird der sogenannte Programmtext in den Hauptspeicher (Speicherwerk) geladen. Der Programmtext enthält die tatsächlich von der CPU ausführbaren Befehle, es handelt sich um die sogenannte Maschinensprache.


Definition: Maschinensprache

Definition

Unter Maschinensprache oder Maschinencode versteht man eine Folge von Einsen und Nullen, die einen oder mehrere Befehle repräsentieren, die auf einer CPU ausgeführt werden können.

Unterschiedliche CPUs unterstützen üblicherweise eine unterschiedliche Anzahl an Befehlen, auch die Notation von evtl. gleichbedeutenden Befehlen kann bei unterschiedlichen CPUs variieren.


Beispiel Maschinencode

Hier sieht man ein Beispiel für Maschinencode:

Code

0000000011000010000000010000110100000000110001010000000100001110000000 0010001101000000011000111000000001000011110000001110000000


Listing 4: Maschinencode (Programmtext)

Und an genau dieser Stelle beginnen die Probleme für den Menschen. Eine sehr lange Reihe von Einsen und Nullen ist nicht wirklich dafür geeignet, dass der Mensch sie problemlos versteht.

Das folgende Video bringt etwas Licht ins Dunkel und erläutert die Bedeutung dieser Reihe.

video


Am Ende des Videos wird auf eine SWF-Animation verwiesen. Das Bearbeiten der Animation stellt eine sinnvolle Fortsetzung des Videos dar, weshalb die folgende Aufgabe dieses aufgreift.


Aufgabe 1

Aufgabe

Bearbeite die SWF-Animation unter
http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/sumprogram.html
und vertiefe damit das Verständnis für die Ausführung von Maschinensprache auf einer CPU.
(Leider ist der hier angegebene Link nicht mehr verfügbar. Bitte verwende stattdessen die auf YouTube bereitgestellten Videos mit der Aufzeichnung der Animation:)

Sum program (Assembler) --> http://youtu.be/_HwoiEkW8nI (03:33)
Sum program (Maschinensprache) --> http://youtu.be/i2sREE1aAOc (03:23)
Diese Videos sind ohne Ton aufgezeichnet.

Die aufgezeichnete Animation steht sowohl für den Ablauf mit Maschinensprache, als auch mit Assembler zur Verfügung. Bedenke, dass Assembler nur eine Vereinfachung für den Menschen darstellt. Auf der CPU werden immer binär codierte Befehle (--> Maschinensprache) ausgeführt.


Befehle in Maschinencode

Die oben gezeigte Reihe aus Einsen und Nullen besteht in diesem Beispiel also aus insgesamt acht Befehlen, von denen jeder aus genau 16 Bit besteht.

Code

0000000011000010
0000000100001101
0000000011000101
0000000100001110
0000000010001101
0000000110001110
0000000100001111
0000001110000000


Listing 5: Acht Maschinensprachebefehle, bestehend aus je 16 Bit


Assemblercode

Diese Maschinensprachebefehle lassen sich für Menschen besser als Assemblercode darstellen:

Code

LOAD #2
STORE 13
LOAD #5
STORE 14
LOAD 13
ADD 14
STORE 15
HALT


Listing 6: Assembler


Wie die verschiedenen auf dieser Seite angegebenen Videos zeigen, ist anhand des Assemblercodes sehr leicht nachvollziehbar, dass der Programmtext auf der betrachteten Beispiel-CPU tatsächlich eine Übersetzung des oben auf dieser Seite gegebenen Quellcodes in einer der Hochsprachen ist.


Hinweis

Hinweis

Der hier verwendete Begriff Assembler wird beispielhaft anhand einiger sehr einfach gehaltener Befehle erläutert. Es soll an dieser Stelle darauf hingewiesen werden, dass es für jeden Computertyp eine spezielle, auf den Befehlssatz des Prozessors zugeschnittene Assemblersprache gibt.

Eine tiefergehende Auseinandersetzung mit Assembler soll an dieser Stelle nicht erfolgen. Bei Bedarf können weitere Hintergründe zu Assemblersprachen in einem gleichnamigen Wikipedia-Artikel nachgelesen werden.

In diesem Zusammenhang veranschaulicht die verlinkte Auflistung von Hallo-Welt-Programmen in verschiedenen Assemblersprachen deutliche Unterschiede.


Ein paar zusätzliche Aufgaben sollen das Thema noch vertiefen.


Aufgabe 2

Aufgabe

Betrachte folgende Internet-Seite, auf der ganz unten das Count program mit SWF-Animation zu finden ist. Starte die SWF-Animation zum Count program und beobachte den Ablauf.
http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/Lesson.html
(Leider ist der hier angegebene Link nicht mehr verfügbar. Bitte verwende stattdessen die auf YouTube bereitgestellten Videos mit der Aufzeichnung der Animation:)

Count program (Assembler) --> http://youtu.be/IwjR83896p0 (09:37)
Count program (Maschinensprache) --> http://youtu.be/zIDj4FlOV7U (09:32)
Diese Videos sind ohne Ton aufgezeichnet.


Aufgabe 3

Aufgabe

Wie funktioniert der im Count program enthaltene EQUAL-Befehl?


Aufgabe 4

Aufgabe

Wie funktioniert der im Count program enthaltene JUMP-Befehl?
Arbeitet JUMP auch auf dem Akkumulator?


Aufgabe 5

Aufgabe

Der Assemblercode des Count program sieht wie folgt aus:

LOAD #5
STORE 15
LOAD #0
EQUAL 15
JUMP #6
HALT
ADD #1
JUMP #3

Erarbeite einen Vorschlag für ein äquivalentes Programm in einer Hochsprache wie Java, C, Pascal oder ähnlich. Diskutiere deinen Vorschlag in deiner Lerngruppe! (Keine Idee? Dann frag in deiner Lerngruppe mal nach einem Tipp!)


Aufgabe 6

Aufgabe

Weise jedem Assembler-Befehl aus der vorangegangenen Aufgabe eine Speicherzelle in der folgenden Abbildung des Speicherwerks zu.

  • Ist das Assembler-Programm so noch lauffähig?
  • Erkläre den anderen Mitgliedern deiner Lerngruppe den Ablauf im Zusammenspiel zwischen CPU und Speicherwerk!

Cpu9-speicher.jpg