Integrierter Assembler
# Integrierter Assembler

Inline-Assembler (oder auch integrierter Assemblercode) wird ein in Assemblersprache geschriebener Programmteil genannt, der im Quelltext einer höheren Programmiersprache integriert ist. Die Einbettung des Assembler-Codeteils wird mittels spezieller Anweisungen deklariert (z. B. beginnend mit asm, __asm__ oder _asm_ sowie ggf. mit weiteren Angaben) und dadurch dem Compiler bekanntgegeben.

## Verwendung

Viele Compiler gehen beim Kompilieren ihrer Hochsprache sowieso den Weg über Assembler-Quelltext. Dabei kann der Inline-Assembler-Quelltext direkt vom Compiler übernommen werden. Vorteile sind, dass man Programmteile in Assembler schreiben kann anstatt ganzer Funktionen (wie im Falle der Integration über den Linker), dass direkter Zugriff auf die Symbole und Variablen der Hochsprache möglich ist und dass umgekehrt auch der Compiler den Assembler-Code sieht und bei seiner Optimierung berücksichtigen kann. Beim GNU Assembler z. B. wird die Kommunikation zwischen Hochsprachcodeteil und Assemblercodeteil über ein Assembler Template ermöglicht. Es definiert die Abbildung von Ein- und Ausgabevariablen aus der Hochsprache auf Assembler zugreifbare Register wie auch sonst im Assemblerteil verwendete Register (Clobber-List) die dem Hochsprachcompiler bekannt gemacht werden.

In der alternativ üblichen Variante, Assembler-Codeteile in Hochsprachenprogrammen zu verwenden, werden Programmteile als Maschinencode aus ggf. unterschiedlichen Sprachen auf der binären Linkerebene verbunden und über die Funktionsschnittstelle aufgerufen. Vorteil ist, dass kein Compilersupport dafür notwendig ist; Nachteile sind die zwischen Betriebssystemen variierenden Calling-Conventions, die die Portierbarkeit erschweren sowie der zusätzliche Befehlsoverhead durch den Funktionsaufruf. Diese Probleme treten bei der Nutzung von Inline-Assembler nicht auf.

Die neueste Variante ist die Verwendung sogenannter Assembler Intrinsics, effektiv Makros, die die Assemblersyntax verstecken, die die einfachere Verwendung von SIMD-Instruktionen erlauben sollen.

## Beispiel (x86)

Beispiel eines C-Programms mit einem Inline-assembler-Codeteil in AT&T-Syntax (GNU Assembler), welches die Werte von zwei Variablen an den Inline-Assemblercodeteil übergibt, diese darin addiert, anschließend das Ergebnis um den Wert 1 erhöht und dann an den C-Codeteil weiter übergibt. Am Ende wird das Ergebnis ausgegeben (hier 10):

## Liste der Compiler mit Inline-Assembler-Unterstützung

Beispiele für Compiler mit Inline-Assembler (alphabetisch):

* cc65
* DMD
* FreeBASIC
* GNAT
* GNU Compiler Collection
* Microsoft Visual C++ (nur 32-Bit-Version)
* PowerBASIC
* PureBasic
* Small Device C Compiler
* Turbo Pascal / Borland Delphi
