Wir haben gelernt das man in Assembler binäre Anweisungen in Schlüsselwörter, den Mnemonics, zusammenfasst. Ebenso, das oft verwendete Aktionen in Interrupts organisiert wurden und ebenfalls in Assembler aufgerufen werden konnten. Wir werden uns nur kurz theoretisch mit Assemblerprogrammen befassen um die Vorteile einer höheren Programmiersprache besser zu verstehen.
Daten werden in Computer in Registern gespeichert. Ein Register hat eine eine Startadresse. Man kann sich das einfach als Tabelle vorstellen wobei der linke Wert die Adresse darstellt und der rechte Wert das was dort gespeichert ist.
Z.B. so:
Adresse | Wert |
---|---|
0 | Hallo Welt |
1 | f8E24D |
2 | 42 |
Sehen wir uns nun ein einfaches Assemblerprogramm genauer an. Die nach dem Doppelslash //
folgenden Erläuterungen sind Kommentare. Kommentare können mithilfe des Doppelslashs in fast allen Programmiersprachen hinzugefügt werden.
Wichtig: Das Programm ist nur ein Beispiel für die komplizierte Programmierung mit Assembler. Ihr müsst es nicht zwingend verstehen, es reicht zu wissen das Assemblerprogramme kompliziert sind und deshalb sogenannte höhere Programmiersprachen entwickelt wurden mit denen man einfacher und bequemer programmieren kann. Eine dieser Hochsprachen ist Java.
org 100h // Startadresse, 'org' steht für 'origin' start: // Markierung des Programmanfangs movdx,unsertext // Verschiebe das was in unsertext gespeichert ist (letzte Zeile) in das dx register movah,09h // Verschiebe den Wert 09h in das Register ah int21h // Führe Interrupt Nr. 21h aus (Der Interrupt 21h hat 29 Funktionen und sieht immer im ah Register nach welche er ausführen soll. moval,0 // Speicher 0 im Register al movah,4Ch // Speicher Interruptaktion 4Ch in Register ah int21h // Wie oben section.data unsertext:db'Hallo Welt',13,10,'$' // 13 = Wagenrücklauf, 10= Zeilenvorschub $ = wird als String markiert
Zeile 4: Der Wert 09h ergibt sich daraus, das der Programmierer eine Interrupttabelle zur Hand hat in der er nachschauen kann welche Nummer die Aktion ‚Bildschirmausgabe‘ hat. In diesem Fall ist das die Aktion 9h des Interrupts 21h. Dieser Wert wird dann im ah Register gespeichert. Anschließend wird der Interrupt 21h aufgerufen welcher dann den Register ah ausliest und ausführt.
Zeile 9: Hier wird die Variable usertext
mit ‚HalloWelt‘ befüllt. Eine Variable kann man sich als einen Behälter vorstellen in dem man Daten ablegen kann. Ausserdem muss festgelegt werden was für eine Art von Daten man in solch einer Variablen ablegt. Ob es z.B. Zeichen oder Zahlen sind. Ein ‚$‘ kennzeichnet diese Variable als vom Datentyp ‚String‘ das ist eine normale Zeichenkette die aus Buchstaben und Zahlen bestehen kann, in diesem Fall ‚Hallo Welt‘. Ein Datentyp stellt wie der Name schon sagt, den Typ der betreffenden Daten dar, also z.B. reine Zahlenwerte oder Buchstaben bzw. Unicode-Zeichen aber auch komplexere Strukturen wie Buttons oder Grafikobjekte.
Die Zeilen 6-8 beenden das Programm und funktionieren ähnlich, wobei die Aktion 4Ch auf das al-Register zugreift das in Zeile 6 mit 0 gefüllt wurde. Dies bedeutet den Programmabbruch.
Wir sehen also, das es relativ kompliziert ist ein Programm in Assembler zu schreiben.
In Java ist das einfacher. Man würde schreiben: System.out.println("Hallo Welt!");
Schon viel einfacher oder?
Um zu Programmieren braucht man mindestens:
- Schlüsselwörter
- Variable
- Rechenzeichen
Ein einfaches Programm das alle drei enthält könnte so aussehen:
String data1 = "James Bond: "; String data2= "Agent 007"; System.out.println(data1 + data2);
Variablen sind wie wir bereits gelernt haben Platzhalter oder „Behälter“ von Daten. Im obigen Programm wird die Zeichenkette „James Bond: “ in einer Variablen vom Typ String namens data1
gespeichert. Dasselbe wird mit Agent 007 gemacht. Dann wird das ganze mit dem System.out.println
ausgegeben. Das + bewirkt hier das beide Buchstaben zusammengefügt werden. Das Ergebnis wäre James Bond: Agent 007
.
String
ist das Schlüsselwort für ein eine Zeichenkette. Zeichenketten können auch Zahlen enthalten, nur mit dem Unterschied das der Computer weiß, das er diese nicht wie Zahlen behandeln muss. Das heisst in einem solchen Fall:
String data1 = "10"; String data2= "20"; System.out.println(data1 + data2);
Wäre das Ergebnis 1020. Da es sich um eine Zeichenkette handelt, fügt der Computer diese nur zusammen. Mit String
teilen wir also dem Compiler mit, das data1 eine Zeichenkette enthält. Mit dem =
wird dann das „A“ der Variablen data1 zugeordnet.
In Java muss bei der Erstellung einer Variablen dem Compiler immer mitgeteilt werden um was für einen Typ es sich handelt.
Zu einem anderen Ergebnis würde man in diesem Fall kommen:
int data1 = "10"; int data2= "20"; System.out.println(data1 + data2);
Hier würde 30
ausgegeben werden, da mit int
die Variablen als Datentyp Integer
ausgewiesen (auch deklarieren genannt) werden. Integer
sind ganze Zahlen. Es werden pro Integer-Variable 32 Bit im Arbeitsspeicher belegt. Damit kann man Zahlen im Bereich von -2.147.483.648 bis 2.147.483.647 darstellen.
Da der Computer jetzt weiß, das es sich um Zahlen handelt, addiert er den Inhalt beider Variablen.
Der Name eines Schlüsselworts darf übrigens nicht für Variablennamen verwendet werden.
In Java gibt es Standard-Datentypen, sogenannte primitive Datentypen. Diese können mit dem vornangestellten Typnamen erstellt werden z.B. String
ist einer dieser Typen.
Wenn man nur den Typnamen mit nachfolgendem Variablennamen angibt, z.B. nur String buchstaben;
, handelt es sich um eine Deklaration, man macht sozusagen dem Computer eine Variable bekannt.
Wird, wie oben der Variablen auch noch ein Wert zugewiesen also
String data1 = "A";
spricht man davon, das die Variable auch noch initialisiert wurde.
Mit dieser Anweisung haben wir also eine Variable deklariert und initialisiert.
Die ersten beiden Zeilen wären in den meisten Programmiersprachen ähnlich. Die dritte Zeile jedoch weist eine Besonderheit auf.
System.out.println
ist in Java kein Schlüsselwort. Es ist ein Zugriff auf die Klassenbibliothek java.lang. Klassenbibliotheken sind in Java hierachisch strukturiert also praktisch wie einem Ordnersystem. Die benötigten Klassenbibliotheken werden am Anfang eines Programms geladen.
Es wird also zunächst die Klasse System aufgerufen. Diese Klasse enthält ein Objekt namens out, das die Methode println (ln = line also print line) zur Verfügung stellt. Diese Methode übernimmt dann die Ausgabe. Eine Methode ist ein kleines Miniprogramm. Methoden sind normalerweise in Klassen und Objekten zu finden. Mithilfe einer Klasse kann man sich praktisch so etwas ähnliches wie ein Schlüsselwort selbst schreiben. Klingt doch super. Und hier sind wir auch schon mitten im Paradigma der Objektorientierung. Mit diesem Paradigma und den Unterschieden zur Prozessorientierung wollen wir uns im nächsten Kapitel beschäftigen. Dort erfahren wir dann auch ganz genau was es mit den Klassen und Objekten auf sich hat.
Zusammenfassung
- Daten werden im Computer in Registern gespeichert, bestehend aus einer Adresse und einem Wert.
- Eine Variable ist ein Behälter der einen Namen hat und auf eine bestimmte Speicheradresse verweist. Diese Speicheradresse enthält Daten eines bestimmten Typs.
- Variable können deklariert (Erstellung) und initialisiert (befüllt) werden.
- Ein Schlüsselwort hat eine bestimmte Bedeutung und ist für diesen Zweck reserviert. Der Name eines Schlüsselworts darf nicht für Variablennamen verwendet werden.
- Mithilfe von Rechenzeichen können Berechnungen durchgeführt werden, aber auch Zeichenketten verbunden werden.
- Ein Paradigma ist das Prinzip oder die Art und Weise nach der programmiert wird.