Integrierter Assembler - LinkFang.de





Integrierter Assembler


Inline-Assembler (oder auch integrierter Assemblercode) ist ein Assemblerspracheteil, der in einen in einer höheren Programmiersprache geschriebenen Quelltext eines Programms integriert ist. Der Übergang wird mittels einer speziellen Anweisung (häufig: asm, __asm__ oder _asm_) dem Compiler deklariert.

Verwendung

Viele Compiler gehen beim Compilieren 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 Hochsprachkompiler bekannt gemacht werden.[1]

Die andere übliche Variante Assembler Codeteile in Hochsprachprogramme einzubinden, ist auf der binären Linkerebene nach der Assemblierung, über die Funktionsschnittstelle. Vorteil ist, dass kein Compilersupport dafür notwendig ist; Nachteile sind die zwischen Betriebssystemen variierenden Calling-Conventions, die die Portierbarkeit erschweren und der zusätzliche Berechnungsoverhead 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.[2]

Beispiel (x86)

Beispiel eines C Programms mit einem Inline-assembler Codeteil in AT&T-Syntax (GNU Assembler), welches die Werte von 2 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):

#include <stdio.h>
 
int main(void)
{
  int foo = 5;
  int bar = 4;
 
  /* Hier beginnt der Inline-Assembler Abschnitt in AT&T-Syntax */
  __asm__ (
      "add %1, %0\n\t" /* Addiert den Wert von Operand %1 zum Wert von Operand %0. */
      "inc %0"         /* Erhöht den Wert von Operand %0 um 1. */
 
      /* Definition der Nebenbedingungen:
       * Diese weisen den C-Variablen der Reihe nach aufzählend einen für den Inline-Assemblercode nutzbaren Operanden
       * zu und teilen dem Compiler mit, auf welche Weise (lesend und/oder schreibend) dieser im Inline-Assemblercode
       * verwendet werden kann und auf welche Register dieser beschränkt ist. Dadurch wird eine korrekte und effiziente
       * Übergabe der Variablenwerte in und aus dem Assemblercodeabschnitt gewährleistet. */
      : "+r" (bar) /* Gibt an, dass die Variable bar sowohl gelesen als auch beschrieben ('+') wird und deren Wert in
                    * ein allgemeines Register ('r') zu platzieren ist.
                    * Als erster Operand wird er im Assemblercodeabschnitt unter der Bezeichnung %0 genutzt. */
      : "g" (foo)  /* Beschränkt die Verwendung der Variable foo nur zum Lesen. Sie kann auf beliebige Weise ('g', im
                    * Speicher, in einem Register oder als Direktwert) an den Assemblerteil übergeben werden.
                    * Als zweiter Operand wird er im Assemblercodeabschnitt unter der Bezeichnung %1 genutzt */
      : "cc"       /* Gibt an, dass die Statusanzeige (durch die Befehle add und inc) verändert wurde. */
  );
 
  /* Hier geht's mit C Code weiter. */
  printf("Ergebnis: %i\n", bar);
  return 0;
}

Liste der Compiler mit Inline-Assembler-Unterstützung

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

Weblinks

Einzelnachweise

  1. GCC-Inline-Assembly-HOWTO – Abschnitt 5.1 Assembler Template (englisch)
  2. MMX, SSE, and SSE2 Intrinsics. Microsoft Developer Network (englisch)

Kategorien: Programmierwerkzeug | Assembler

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Integrierter Assembler (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.