Assemblersprache

Eine Assemblersprache ist eine spezielle Programmiersprache, die die Maschinensprache einer spezifischen Prozessorarchitektur in durch den Menschen lesbarer Form repräsentiert. Jede Computerarchitektur hat folglich ihre eigene Assemblersprache.

Ein Programm in Assemblersprache wird auch als Assemblercode bezeichnet. Es wird durch einen speziellen Compiler, einen so genannten Assembler, in direkt ausführbare Maschinensprache (auch Maschinencode) umgewandelt. Die umgekehrte Umsetzung von Maschinencode in menschenlesbaren Assemblercode wird Disassemblierung genannt. Dabei gehen allerdings einige wesentliche Informationen verloren, z. B. Bezeichner und Kommentare.

In Assemblersprache (umgangssprachlich oft nicht ganz korrekt ebenfalls als Assembler bezeichnet) programmierte Programme zeichnen sich dadurch aus, dass man die komplette Bandbreite des Computers ausnutzen und Hardwarechips direkt programmieren kann. Assemblerprogramme sind praktisch immer um ein Vielfaches kleiner und schneller als Programme, die mit einer Hochsprache entwickelt wurden, wobei sich der Abstand durch moderne optimierende Compiler aber etwas verringert hat. Die hauptsächlichen Nachteile von Assemblerprogrammen sind höhere Fehleranfälligkeit, extrem großer Programmieraufwand bei umfangreichen Projekten, die Unmöglichkeit ohne weiteres auf einem Rechner mit anderem Hardwareaufbau abzulaufen, sowie die im allgemeinen leichtere Entschlüsselbarkeit des Codes durch Wettbewerber und Konkurrenten. Praktisch wird deshalb heute Assemblerprogrammierung fast nur noch für kleine, aber besonders geschwindigkeitsbedürftige Teile von größeren Programmen eingesetzt.

Inhaltsverzeichnis

Was ist eine Assemblersprache

Programmbefehle in Maschinensprache sind einfache Bitmuster, die sich aus den Opcodes und den dazugehörigen Daten bilden. Da die Zahlenwerte der Opcodes schwieriger zu merken sind, verwendet eine Assemblersprache besser merkbare Kürzel, so genannte mnemonische Symbole (kurz Mnemonics, dieser Begriff wurde eingeführt von Ada Lovelace, der ersten Person überhaupt, welche Computerprogramme schrieb).

Beispiel:

Der folgende Befehl in der Maschinensprache von x86-Prozessoren

 10110000 01100001
 

entspricht dem Assemblerbefehl

 mov $0x61, %eal    ; AT&T-Syntax (Zeichen nach einem „;“ gelten als Kommentare)
 

bzw.

 mov al, 61h        ; Intelschreibweise 
 

und bedeutet, dass der hexadezimale Wert 61 (97 dezimal) ins Register 'al' geladen werden soll. (al: dabei steht das 'a' für das Register, und das 'l' für low, was praktisch dem ersten Teil des Registers entspricht) Der Zweite Teil des Registers wird mit einem 'h' ausgezeichnet, das 'h' steht für High (Beispiel: 'ah'). Soll das ganze Register (je nach Speicherbedarfs des Typen der gespeichert werden soll) angesprochen werden wird 'l' bzw. 'h' durch 'x' ersetzt: 'ax'). Mit Computerhilfe kann man das eine in das andere weitgehend eins zu eins übersetzen. Jedoch werden Adressumformungen vorgenommen, so dass man symbolische Adressen benutzen kann. Im Allgemeinen haben die Assembler neben den eigentlichen Codes auch Steueranweisungen, die die Programmierung bequemer machen, zum Beispiel zur Definition eines Basisregisters.

Häufig werden komplexere Assemblersprachen (Makroassembler) verwendet, um die Programmierarbeit zu erleichtern. Makros sind dabei Bruchstücke von Assemblercode, der vor dem eigentlichen Assemblieren automatisch an Stelle der Makroaufrufe eingefügt wird. Dabei können einfache Parameterersetzungen vorgenommen werden. Die Disassemblierung von derart generiertem Code ergibt allerdings den reinen Assemblercode ohne die beim Übersetzen expandierten Makros.

Verschiedene Assemblersprachen

Jede Computerarchitektur hat ihre eigene Maschinensprache und damit Assemblersprache. Vereinzelt existieren sogar mehrere verschiedene Assemblersprachen (und zugehörige Assembler) für die gleiche Prozessorarchitektur. Das Beispiel oben ist für den 80386. Die Sprachen unterscheiden sich in Anzahl und Typ der Operationen.

Jedoch haben alle Architekturen die folgenden grundlegenden Operationen:

Bestimmte Rechnerarchitekturen haben oft auch komplexere Befehle wie z. B.

Der Nutzen von Assemblern

Es gibt unterschiedliche Ansichten zum Nutzen der direkten Programmierung in Assemblersprache. In vielen Fällen können moderne Compiler höhere Programmiersprachen in effizienteren und schnelleren Code übersetzen als ein unerfahrener Assemblerprogrammierer, speziell auf RISC-Prozessoren, die in stärkerem Maß als CISC-Prozessoren von optimierenden Compilern abhängen.

Ein Kern an Code muss immer in Maschinensprache programmiert werden. Dazu gehören Teile der Systemprogrammierung, z. B. Betriebssystemerstellung oder Betriebssystem-API-Programmierung, sowie auf einigen Plattformen die Treiber-Programmierung.

Dazu werden häufig Cross-Assembler eingesetzt, die Code für eine andere Rechnerarchitektur erzeugen als die, auf der sie selbst ablaufen. Auch Compiler sind ja Programme, die erst einmal in Maschinencode übersetzt werden müssen, bevor mit ihrer Hilfe Programme übersetzt werden können.

Es gibt aber Fälle, in denen diskrete Berechnungen einfacher und effizienter direkt in Assembler geschrieben werden. Die meisten Hochsprachencompiler übersetzen zuerst in Assemblercode oder können diesen optional ausgeben, sodass man, wenn man will, Details genauer betrachten und gewisse Stellen von Hand optimieren kann.

Bei vielen Anwendungen für Geräte, die von so genannten Mikrocontrollern gesteuert sind, ist oft Programmierung in Assembler notwendig, um die knappen Ressourcen dieser Mikrocontroller optimal auszunutzen. Dies gilt insbesondere, wenn wegen Massenproduktion möglichst günstige und damit minimale Mikrocontroller verwendet werden sollen.

Bis ca. 1990 wurden die meisten Computerspiele in Assemblersprachen programmiert, da nur so auf Heimcomputern und den damaligen Spielkonsolen eine akzeptable Spielgeschwindigkeit und eine den kleinen Speicher dieser Systeme nicht sprengende Programmgröße zu erzielen war. Noch heute gehören Computerspiele zu den Programmen, bei denen am ehesten kleinere assemblersprachliche Programmteile zum Einsatz kommen.

Weblinks


Kategorie:Programmiersprache Kategorie:Assembler

See also: Assemblersprache, 80386, Ada Lovelace, Application Programming Interface, Assembler (Informatik), Betriebssystem, Bezeichner, CISC, Compiler, Computer