Was ist ein Assembler?

,
binary 3044663 640

Bei einem Assembler handelt es sich um ein Computer-Programm, das den Assemblercode in Maschinensprache (Binärcode) übersetzt. Da Assembler sehr nahe an der Prozessorebene arbeiten, gelten sie daher als äußerst effizient und sparsam und sind außerdem in der Lage, den vollständigen Befehlssatz des Prozessors zu nutzen. Der US-amerikanische Informatiker Nathaniel Rochester hat in dem Zeitraum zwischen 1948 und 1950 den ersten Assembler für den IBM-701-Großrechner entwickelt.

Assembler sind äußerst effizient

Ein Assembler ist in der Lage, den in der Assemblersprache geschriebenen Code direkt in Maschinensprache zu übersetzen, wobei der Computercode entweder manuell oder maschinell generiert werden kann. Einige Compiler führen Programmcode zunächst in Assemblercode über und rufen anschließend einen Assembler auf, der den Code weiterbearbeitet. Dieser fungiert dann selbst als eine Art Computer und erstellt in dem abschließenden Schritt den Binärcode. Moderne Assembler sind in der Lage den Befehlssatz eines Prozessors in vollem Umfang zu nutzen, da für jede Assembleranweisung je ein Gegenstück auf Maschinenebene existiert. Programmiersprache höherer Ebenen, wie beispielsweise Java, Python oder JavaScript beschränken sich hingegen auf einen bestimmten Teil des bereitgestellten Befehlssatzes. Aus diesem Grund stellen viele Programmiersprachen die Option bereit, bei Bedarf Assemblercode zu inkludieren.

Jede Prozessor-Architektur hat eine eigene Sprache

Jeder Prozessor hat einen eigenen Befehlssatz und spricht eine eigene Sprache. Da die Kommunikation mit dem Prozessor über seinen Befehlssatz erfolgt, benötigt eine jede CPU einen speziellen, auf seine individuellen Anforderungen und Bedürfnisse ausgerichteten Assembler inklusive einer eigenen Assemblersprache. Nur Code, der in dieser Sprache geschrieben ist, kann von dem dazugehörigen Assembler interpretiert und übersetzt werden. Ein Programm, das für einen AMD-Prozessor geschrieben wurde, kann also von einer Intel-CPU nicht ohne Anpassungen verwendet werden. Obwohl Assemblerprogramme stark plattformabhängig sind, unterscheiden sich die einzelnen Assemblersprachen nur minimal voneinander. Aus diesem Grund ist es in vielen Fällen relativ einfach, ein Programm auf den Befehlssatz eines anderen Prozessors anzupassen. Die Unterschiede können bei manchen Prozessoren aber auch so groß sein, dass Programme komplett neu geschrieben werden müssen, bevor sie auf einer anderen CPU-Architektur ausgeführt werden können.

security 265130 640

Assemblersprache im Überblick

Wie wir bereits im obigen Absatz erwähnt haben, gibt es für jeden Assembler eine eigene Assemblersprache, die auf die speziellen Anforderungen und Gegebenheiten der jeweiligen Zielarchitektur angepasst ist. Ein Entwickler kann mit Assemblersprache Code schreiben, der unmittelbar von einem Assembler verarbeitet und in Binärcode umgewandelt werden kann. Bei der Assemblersprache kommen sogenannte „mnemonische Kürzel“ für die internen Anweisungen des Prozessors zum Einsatz. Mit diesen Befehlen lassen sich arithmetische und logische Operationen sowie Zugriffe auf CPU-Register verwalten, sodass sich der Programmfluss sehr effizient steuern lässt. Je nach CPU-Architektur können auch noch weitere Anweisungen und Befehlssätze hinzukommen.

Mehr zum Thema:
Was ist Apache? Ein Leitfaden zu Webserver-Technologien

Der wesentliche Vorteil von Assemblercode spiegelt sich in der Tatsache wider, dass die Überführung in Binärcode sehr effizient ist. Assemblersprache befindet sich sehr nahe an der CPU-Ebene. Aus diesem Grund kann Assemblercode äußerst schnell und mit minimalem Speicherbedarf in Maschinensprache überführt werden. Die Anweisungen lassen sich generell 1:1 übersetzen und müssen nicht zunächst interpretiert und in eine Zwischensprache kompiliert werden. Heutzutage erzielen die Compiler höherer Programmiersprachen in vielen Fällen eine vergleichbare Performance. Vor allem bei komplexeren CPU-Architekturen werden sehr hohe Anforderungen an den Assembler-Programmierer gestellt, weswegen ein hohes Kontextwissen erforderlich ist, um alle Ressourcen und Befehle des jeweiligen Prozessors optimal ausnutzen zu können. Falls dem Programmierer dieses Wissen fehlt, dann leidet auch dementsprechend die Performance darunter.

matrix 2883623 640

Abgrenzung zu höheren Programmiersprachen

Immer mehr an maschinennaher Entwicklung, was die Domäne der Assemblersprache ist, lässt sich heute fast komplett durch höhere Programmiersprachen abdecken. Hinzu kommt noch, dass die Rechenleistung und der Speicher heutzutage so preiswert sind, dass sich der enorme Aufwand, um Code in Assemblersprache zu entwickelt, für die meisten Systeme überhaupt nicht lohnt. Heute werden in erster Linie wichtige und zeitkritische Systeme direkt in Assemblersprache verfasst, wie beispielsweise Autopilotensysteme in Flugzeugen. Darüber hinaus kommt Assemblersprache heutzutage häufig zu Lehrzwecken zum Einsatz, da sie sehr nahe an der Prozessorebene arbeitet und so beispielsweise die Arbeitsweise einer CPU verdeutlicht.

Generell wirkt Code, der in Assemblersprache verfasst wurde, sehr umständlich, kryptisch und limitiert. Assemblerprogramme sind viel länger als vergleichbarer Code in einer modernen Programmiersprache, da jegliche Datenstrukturen und Algorithmen und andere wichtige Konstrukte nicht teil des Assemblerbefehlssatzes sind und in Eigenregie implementiert werden müssen. Außerdem lassen sich lange Assemblerprogramme nur mit großer Mühe pflegen und erweitern, da der minimalistische Assemblercode nur schwer nachvollziehbar ist.