Assemblersprache

Assemblersprache

Copyright © Shutterstock/VintageTone

Was ist eine Assemblersprache?

Eine Assemblersprache ist eine Low-Level Programmiersprache, die für eine bestimmte Computerarchitektur, zum Beispiel bestimmte Mikroprozessoren und andere programmierbare Geräte spezifisch ist. Im Vergleich dazu können viele höhere Programmiersprachen auf mehreren Architekturen verwendet werden, müssen jedoch interpretiert oder kompiliert werden, bevor sie von einem Prozessor verarbeitet werden können. Eine reine Assemblersprache ist eine Sprache, in der jede Anweisung genau eine Maschinenanweisung erzeugt.

Ursprung und Anlass für die Entwicklung von Assemblersprachen

Die erste Assemblersprache und die Verwendung des Wortes Assemblieren für die Übersetzung des Programmcodes in Maschinencode gehen zurück auf das Jahr 1947. Damals wurde an der Londoner Universität die erste Assemblersprache auf der Grundlage von Arbeiten von John von Neumann und Herman Goldstine am Institute for Advanced Study entwickelt. Die erste Assemblersprache von IBM war SOAP (Symbolic Optimal Assembly Program), die 1955 für den IBM 650 Computer entwickelt wurde.

Die grundlegendsten Anweisungen, die von einem Computer ausgeführt werden, sind binäre Codes, die aus Einsen und Nullen bestehen. Diese können direkt in die Einschalt- und Ausschaltzustände für den Prozessor übersetzt werden. Für Softwareentwickler ist es allerdings unpraktisch, Informationen in Einsen und Nullen zu übersetzen, daher wurden Assemblersprachen entwickelt, um den Prozess zu vereinfachen.

Die Verwendung von symbolischen Namen und symbolischen Adressen anstelle von binären oder hexadezimalen Adressen erleichtert das Programmieren in Assemblersprachen im Vergleich zur Maschinensprache. Die Programmierer haben zudem, anders als bei Hochsprachen, Zugriff auf alle Funktionen und Anweisungen auf dem Zielrechner. Assemblersprachen sind wesentlich weniger fehleranfällig als die langwierigen und zeitraubenden Programmiersprachen der ersten Generation, die bei den frühesten Computern eingesetzt wurden. So müssen bei den Assemblersprachen beispielsweise keine Adressen berechnet werden.

Funktionsweise einer Assemblersprache

Assemblersprachen verfügen im Allgemeinen nicht über Annehmlichkeiten auf hohem Niveau wie Variablen und Funktionen und sie sind nicht zwischen verschiedenen Familien von Prozessoren übertragbar. Sie haben die gleichen Strukturen und Befehle wie die Maschinensprache, erlauben es einem Programmierer jedoch, Namen anstelle von Zahlen zu verwenden.

Ein in Assemblersprache geschriebenes Programm besteht aus einer Reihe von sogenannten Mnemonic Prozessor-Anweisungen und Meta-Statements die als Direktiven, Pseudo-Instruktionen und Pseudo-Ops bezeichnet werden sowie, Kommentaren und Daten. Assembler-Sprachanweisungen bestehen normalerweise aus einem Opcode-Mnemonic gefolgt von einer Liste von Daten, Argumenten oder Parametern. Diese werden von einem Assembler in maschinensprachliche Anweisungen übersetzt, die in den Speicher geladen und ausgeführt werden können.

Zum Beispiel teilt der folgende Befehl einem x86 / IA-32-Prozessor mit, einen 8-Bit-Wert in ein Register zu verschieben. Der Binärcode für diese Anweisung ist 10110, gefolgt von einer 3-Bit-Kennung, für die das Register verwendet werden soll. Die Kennung für das AL-Register ist 000, daher lädt der folgende Maschinencode das AL-Register mit den Daten 01100001.

 

Dieser binäre Computercode kann lesbar gemacht werden, indem er wie folgt in hexadezimaler Form ausgedrückt wird:
B0 ist die Anweisung an den Prozessor eine “Kopie des folgenden Wertes in AL verschieben”. 61 ist eine hexadezimale Darstellung des Wertes 01100001, der 97 in dezimal ist. Die Assemblersprache für die 8086-Familie stellt den mnemonischen MOV, eine Abkürzung von “move”, für Anweisungen bereit, sodass der obige Maschinencode in Assemblersprache geschrieben werden kann. Falls erforderlich, einschließlich Kommentare.

Aktuelle Nutzung von Assemblersprachen

Assemblersprachen sind nützlich, wenn Programme bis auf Bytes und sogar auf die Bit-Ebene hinab nicht mehr Platz als unbedingt notwendig beanspruchen sollen, oder, wenn Unterroutinen für Funktionen geschrieben werden müssen, die nicht von anderen symbolischen Programmiersprachen wie COBOL, Fortran oder PL / I bereitgestellt werden. Sie wurden einst für alle Arten von Programmierung verwendet.

In den 1980er Jahren und Anfang der 1990er Jahre mit der Verbreitung von Mikrocomputern wurde ihre Verwendung jedoch weitgehend von höheren Sprachen verdrängt, um eine verbesserte Programmierproduktivität zu erreichen. Assemblersprachen werden heute noch für direkte Hardware-Manipulation, Zugriff auf spezielle Prozessoranweisungen oder zur Lösung kritischer Leistungsprobleme verwendet.

Assemblersprachen können zur Optimierung der Verarbeitungsgeschwindigkeit oder zur Optimierung der Programmgröße verwendet werden. Im Falle der Geschwindigkeitsoptimierung werden moderne Compiler benötigt, um Hochsprachen in Code umzuwandeln, der so schnell wie eine handgeschriebene Assemblierung ist.

Die Komplexität moderner Prozessoren und Speichersubsysteme macht eine effektive Optimierung für Compiler wie auch für die Programmierung in Assemblersprachen zunehmend schwieriger. Die immer höhere Prozessorleistung hat darüber hinaus dazu geführt, dass viele CPUs die meiste Zeit im Leerlauf betrieben werden. Dadurch ist die Ausführungsgeschwindigkeit von Rohcode für viele Programmierer zu einer Nebensache geworden. Assemblersprachen werden dadurch zunehmend überflüssig.

Typische Anwendungsgebiete von Assemblersprachen

Trotzt der immer wieder geführten Diskussionen, ob Assemblersprachen heute noch sinnvoll genutzt werden können und sollten, rangierten sie 2017 im TIOBE-Index für Programmiersprachen auf Platz 11 noch vor Visual Basic. Die Assemblersprache hat spezifische Nischen, wo sie nach wie vor wichtig ist. Typische Anwendungen sind Gerätetreiber, eingebettete Systeme auf niedriger Ebene und Echtzeitsysteme.

Assemblersprachen werden normalerweise im Systemstartcode verwendet, dem Low-Level-Code, der die Systemhardware vor dem Booten des Betriebssystems initialisiert und testet und häufig im ROM gespeichert wird. Zum Beispiel das BIOS auf IBM-kompatiblen PC-Systemen und früheren CP/M Systemen. Einige Compiler übersetzen High-Level-Sprachen zuerst in die Assemblersprache, bevor sie vollständig kompiliert werden, wodurch der Assemblercode für Debugging- und Optimierungszwecke angezeigt werden kann.
Einige Compiler für Low-Level Programmiersprachen wie Pascal oder C ermöglichen es dem Programmierer, Assemblersprache direkt in den Quellcode einzubetten. Programme, die solche Einbettungen verwenden, können dann Abstraktionen unter Verwendung verschiedener Assemblersprache auf jeder Hardwareplattform konstruieren. Der portable Code des Systems kann dann diese prozessorspezifischen Komponenten über eine einheitliche Schnittstelle verwenden.
Die Assemblersprache ist im sogenannten Reverse Engineering nützlich. Viele Programme sind nur in Maschinencodeform verbreitet, die einfach in eine Assemblersprache, aber schwieriger in eine höhere Sprache zu übersetzen ist. Spezielle Disassembler übersetzen den Maschinencode und die Assemblersprache in eine höhere Programmiersprache. Diese Technik wird von Hackern verwendet, um kommerzielle Software zu knacken. Softwarehersteller nutzen diese Technik, um Software mit ähnlichen Fähigkeiten wie die von konkurrierenden Unternehmen zu produzieren.

Assemblersprachen wurden und werden in erster Linie jedoch verwendet, um die Ausführungsgeschwindigkeit von Programmen zu erhöhen. Dies bedeutete insbesondere bei frühen Personal Computern mit begrenzter Prozessorleistung und kleinem Arbeitsspeicher (RAM) Vorteile.


Sie haben noch Fragen?

Kontaktieren Sie uns

Kostenloser SEO-Check der OSG


Weitere Inhalte