Programmieren: Wahl der Programmiersprache: Maschinennahe Sprachen

Aus Wikibooks

Wechseln zu: Navigation, Suche
Wikibooks buchseite.svg Zurück zu Wahl der Programmiersprache | One wikibook.svg Hoch zu Inhaltsverzeichnis | Wikibooks buchseite.svg Vor zu Hochsprachen



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


Wikibooks buchseite.svg Zurück zu Wahl der Programmiersprache | One wikibook.svg Hoch zu Inhaltsverzeichnis | Wikibooks buchseite.svg Vor zu Hochsprachen


Persönliche Werkzeuge