Assemblersprache

Assamblersprache

Copyright ┬ę Shutterstock / Vintage Tone

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