Assembler (Informatik)
Ein Assembler der Informatik ist ein spezielles Übersetzungsprogramm, das ein in einer maschinennahen Assemblersprache geschriebenes Programm in Maschinensprache übersetzt. Oft wird der Ausdruck Assembler auch als Abkürzung oder Synonym für Assemblersprache verwendet.
Zu beachten ist, dass verschiedene Prozessorarchitekturen grundverschiedene Assembler- und Maschinensprachen haben, so dass jeweils ein zur aktuellen Architektur passender Assembler benötigt wird. Es gibt jedoch Assemblerfamilien, die mehrere Prozessoren unterstützen bei gleichbleibender Makrosprache und Arbeitsumgebung; der GNU Assembler ist z. B. eine solche Familie.
Die einfachste Version eines Assemblers, kombiniert mit der Möglichkeit, Programme interaktiv zu testen und zu analysieren, wird Maschinensprachemonitor genannt. Makroassembler gestatten die Bildung von parametrisierbaren Befehlsgruppen. Eine Makroanweisung wird im allgemeinen in mehr als einen Maschinenbefehl umgesetzt.
Der Anteil der Assemblerprogrammierung ist im Sinken. Der Möglichkeit der Erstellung effektiver Programme steht die erschwerte Wartbarkeit von Assemblerprogrammen gegenüber. Maschinennahe Programmierung – die Domäne von Assembler – kann heute überwiegend durch höhere Programmiersprachen abgedeckt werden. Einige Programmiersysteme für höhere Programmiersprachen gestatten es, Assemblerbefehle in den Quelltext mittels Inline-Assembler zu integrieren. Die Anwendung kann sich dann auf die Situationen beschränken, in denen es aus funktionalen oder Effizienzgründen notwendig oder nützlich ist, maschinennah zu programmieren.
Siehe auch: Cross-Assembler
Abgrenzung zu Compilern
Im Unterschied zu Compilern, die eine Hochsprache wie z.B. C oder Pascal in Maschinensprache übersetzen, sind Assembler immer spezifisch auf einen oder wenige Prozessortypen ausgerichtet.
Beim Assembler werden die Opcodes der jeweiligen CPU mit Namen, den sogenannten Mnemonics angegeben, während Hochsprachen primär die Umsetzung in Opcodes über mehrere automatisierte Abstraktionsebenen hinweg bewerkstelligen. Dadurch werden Eigenschaften wie etwa eine begrenzte Registerbreite vor dem Programmierer versteckt. In Assembler sind nur Operationen im Rahmen der möglichen Register- und Operationsgrößen der CPU möglich. Oftmals sind Pragma-, Preprozessor- und Makrofähigkeiten in Assemblern möglich, die sich aber nur bedingt mit den Möglichkeiten von Hochsprachen vergleichen lassen.
Assembler sind häufig extrem einfach aufgebaut und daher meist auch sehr schnell. Compiler hingegen übersetzen oft zunächst das Programm in eine Zwischensprache, die dann an einen Assembler weitergeleitet und in das letztlich benötigte Maschinenprogramm umgewandelt wird. Bei modernen Compilern erfolgt dieser Schritt implizit.
Ein Programm zum Rückübersetzen von Maschinensprache in Assemblersprache ist ein Disassembler. Diese Rückübersetzung ist möglich, da es – anders als bei Hochsprachen – eine Eins-zu-Eins-Beziehung zwischen einfacher Assemblersprache und Maschinensprache gibt. Dabei können jedoch Bezeichner und Kommentare nicht wiederhergestellt werden, da diese während der Assemblierung verloren gehen. Meist werden aber etwas komplexere Assemblersprachen mit Makrofähigkeiten verwendet, so dass diese einfache Abbildung nicht mehr hundertprozentig zutrifft.
Die Tätigkeit des Disassemblierens ist bei urheberrechtlich geschützten Programmen durch Copyright-Bestimmungen reglementiert bis verboten, da das Disassemblieren die Möglichkeit eröffnet, den Code einfach zu ändern und danach wieder in ein Programm zu assemblieren. So könnte von erfahreneren Assembler-Programmieren und Hackern z.B. eine Passwortabfrage entfernt, eine etwa aus lizenzrechtlichen Gründen abgeschaltete Funktion aktiviert, oder ein Virus in das Programm eingeschleust werden.
Hersteller und Produkte
Für die x86-Prozessoren-Familie und kompatible Prozessoren (z. B. Intels Pentium oder AMDs Athlon) sind der Microsoft Macro Assembler (MASM), Borland Turbo Assembler (TASM) und der Netwide Assembler (NASM) weit verbreitet. Auch der Flat Assembler (FASM) bietet viele Features, die ein moderner Assembler benötigt. Neben Assemblern, die die Intel-Syntax kennen, gibt es noch solche, die Assemblercode in der AT&T-Syntax assemblieren können, wie den unter Linux hauptsächlich genutzten GNU Assembler (gas).
Auf IBM-Großrechnern (zSeries) wird der High Level Assembler verwendet, Hercules-Anwender müssen entweder den veralteten Assembler Assembler-F benutzen oder aber den Tachyon Legacy Assembler verwenden, welcher unter Linux für z/Series läuft.
Für die Mikrocontrollerfamilie MCS-51 von Intel, deren erster Vertreter der 8051 war, gibt es den freien Macroassembler ASEM-51. Heute gibt es bereits hunderte von 8051-Derivaten von über einem Dutzend Halbleiterherstellern.
Siehe auch: Betriebssystem