Programmieren: Wahl der Programmiersprache: Maschinennahe Sprachen
Aus Wikibooks
Diese maschinennahen Sprachen sind für Anfänger im Programmieren von keiner praktischen Bedeutung; sie werden hier nur zur Hintergrundinformation erwähnt:
Inhaltsverzeichnis |
[Bearbeiten] Maschinensprache
Der Computer selbst versteht nur Maschinensprache. Die Maschinensprache ist für den Menschen nur sehr schwer lesbar und entsprechend schwer ist es, selbst kleinere Programme zu entwickeln. Heutzutage werden deshalb praktisch keine Programme mehr in Maschinensprache entwickelt.
[Bearbeiten] Assembler
Um die Programmierung von Computern zu vereinfachen, kam bald die Idee auf, anstelle der Einsen und Nullen, aus denen die Maschinensprache besteht, Abkürzungen einzuführen. Und was lag näher, als den Computer selbst die Übersetzung durchführen zu lassen? Ein solches Übersetzungsprogramm heißt ebenfalls 'Assembler'. Anstelle von 100010 wurde nun beispielsweise die Abkürzung mov benutzt. Solche Abkürzungen werden auch als Mnemonics bezeichnet.
Für Anfänger ist Assembler ungeeignet. Der Lernaufwand ist sehr hoch, die Sprache muss bei jeder Plattform und jedem Betriebssystem neu gelernt werden (auch wenn gewisse Gemeinsamkeiten bestehen) und umfangreichere Programme lassen sich praktisch nicht realisieren.
[Bearbeiten] Vorteile
Dennoch wird auch heute noch Assembler eingesetzt, wenn es darum geht, Programme zu schreiben, die direkt auf die Hardware zugreifen, wie etwa Treiber. Außerdem hat Assembler den Vorteil, dass die Ausführungsgeschwindigkeit sehr hoch ist, so dass die Sprache sehr gut für zeitkritische Anwendungen geeignet ist. Viele Programmierer empfehlen das Lernen von Assembler, da es den Programmierer zwingt, sich mit den Vorgängen im Inneren eines Computers auseinanderzusetzen und so helfen kann, Ihre Hochsprachenprogramme zu verbessern.
[Bearbeiten] Nachteile
Assemblersprachen haben (wie die Maschinensprache auch) den Nachteil, dass sie sehr schwer zu erlernen sind. Außerdem werden die Programme speziell für eine bestimmte Prozessorlinie geschrieben und können nur auf dem Rechner und dem Betriebssystem benutzt werden, für das sie geschrieben wurden. Wenn Sie also die Assemblersprache eines bestimmten Herstellers gelernt haben, dann müssen Sie, sobald Sie einen Assembler eines anderen Herstellers verwenden, ggf. umlernen, spätestens aber dann, wenn Sie einen Assembler für einen anderen Prozessor verwenden, denn jeder Prozessor hat einen anderen Befehlssatz. Hochsprachen, die wir gleich noch kennenlernen werden, sind generell portabler, da der Compiler für Sie die Übersetzung in Assembler für die jeweilige CPU vornimmt.
[Bearbeiten] Anwendungsbereich
- Hardwarenahe Programmierung
- Treiberprogrammierung
- Zeitkritische Anwendungen
[Bearbeiten] Beispielprogramm
Folgendes Beispielprogramm ist für eine Assemblerumgebung der X86-Prozessor-Linie gedacht.
L1: CMP AL, 41H JNZ L2 LEA DX, txt MOV AH, 09H INT 21H MOV AH, 08H JMP L1 L2: CMP BX, CX
Dieser Code stellt eine while-Schleife dar, was in einer Hochsprache folgendem Code entspräche.
while(bedingung){
tu_was();
}
Der Assemblercode bedeutet im Detail:
L1:
Starten der Subroutine L1
CMP AL, 41H
Vergleiche (Compare = CMP) 41 Hexadezimal (41H) mit dem Lowbyte des A-Registers. Dazu wird einfach von al 41H abgezogen.(Das Ergebnis aber nicht gespeichert)
JNZ L2
Springe zu Subroutine L2, wenn nicht null. (JNZ = Jump if not zero). Die vorherige Zeile setzt das Zero-Flag, das hier abgefangen wird. Falls der Vergleich ergibt, dass die beiden Werte ungleich sind ist das Flag 0, ansonsten 1. Wenn das Flag also 0 ist (not zero) dann wird zu L2 gesprungen.
LEA DX, txt
LEA lädt die Adresse des Strings txt in DX. Ein Zeiger auf die Variable txt wird also ins D-Register kopiert. Die Werte in DX können durch einen interrupt ausgegeben werden (siehe unten).
MOV AH, 09H
Die Zahl 9 Hexadezimal (09H) wird ins Highbyte des A-Registers kopiert. Je nachdem welche Zahl hier steht löst der folgende Interrupt verschiedene Aktionen aus.
INT 21H
Jetzt kommt der Interrupt. Das 09H im Highbyte des A-Registers bedeutet jetzt "Ausgeben" und zwar den String auf den DX zeigt.
JMP L1
Danach wird wieder zu L1 gesprungen.
Ein "Hello World"-Programm würde so aussehen: (MASM-Syntax)
DATA SEGMENT
Hello db "Hello World!$"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
Start:
mov ax,DATA
mov ds,ax ;Datensegment Laden
mov ah,9 ;Funktion 9(Ausgeben) von Interrupt 0x21
mov dx,OFFSET Hello ;Addresse des Strings laden...
int 21h ;...und Ausgeben
mov ax,4C00h ;ah = 0x4C -> Funktion Beenden von Int 0x21
;al = 0 -> Errorcode
int 21h ;Und Beenden
CODE ENDS
END Start