Integrierter Assembler

Integrierter Assembler

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

Inhaltsverzeichnis

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 neuste Variante ist die Verwendung sogenannter Assembler Intrinsics, effektiv Makros, die die Assemblersyntax verstecken, die die einfachere Verwendung von SIMD-Instruktionen erlauben sollen.[2]

x86 Beispiel

Beispiel eines C Programms mit einem Inline-assembler Codeteil in Intel Syntax (GNU Assembler), welches die Werte von 2 Variablen an den Inline-Assemblercodeteil übergibt, diese darin zusammen 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()
{
  int foo = 5, bar = 4;
 
  /* Hier beginnt der Inline-Assembler Abschnitt in Intel Syntax */
  __asm__ (".intel_syntax noprefix\n" /* teilt dem Assembler mit, daß die Intel Syntax verwendet wird */
      "mov eax, dword ptr %0\n"  /* kopiert den Inhalt des ersten Operanden in das EAX Register */
      "mov ebx, dword ptr %1\n" /* kopiert den Inhalt des zweiten Operanden in das EBX Register */
      "add eax, ebx\n" /* addiert den Wert im EBX Register zum Wert im EAX Register */  
      "inc eax\n" /* erhöht den Wert im EAX Register um 1 */
      "mov dword ptr %0, eax\n" /* kopiert den Wert im EAX Register an die Speicheradresse von %0 */
 
      /* Definition der Constraints: 
         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 oder schreibend)
         dieser im Inline-Assemblercode verwendet werden kann und auf welche Register dieser beschränkt ist. 
         Dadurch wird eine korrekte Übergabe der Variablenwerte in und aus dem Assemblercodeabschnitt gewährleistet. */
      : "=m" (bar) /* der Ausdruck =m teilt dem Compiler mit, daß der Speicherort der Variable bar 
                      sowohl schreibend als auch lesend vom Assemblercodeteil benutzt wird.
                      Als erster Operand wird er im Assemblercodeabschnitt unter der Bezeichnung %0 genutzt */
      : "b" (foo) /* der Ausdruck b beschränkt die Adresse der Variable foo lesend auf die Nutzung des EBX Registers.
                     Als zweiter Operand wird er im Assemblercodeabschnitt unter der Bezeichnung %1 genutzt */
  );
 
  /* Hier geht's mit C Code weiter */
  printf("Ergebnis: %i", bar);
  return 0; 
}

Anmerkung: Bei der Intel Syntax für den Inline-Assemblercode muß bei der Nutzung des GCC Compilers das Programm mit der Option -masm=intel compiliert werden, weil ansonsten der GCC Compiler von einer AT&T Syntax ausgeht.

Liste der Compiler mit Inline-Assembler Unterstützung

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

Einzelnachweise

  1. GCC-Inline-Assembly-HOWTO - Abschnitt 5.1 Assembler Template. (englisch)
  2. MMX, SSE, and SSE2 Intrinsics - msdn.microsoft.com (englisch)

Weblinks

Wikibooks Wikibooks: Assembler – Lern- und Lehrmaterialien

Wikimedia Foundation.

Игры ⚽ Нужен реферат?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Assembler-Code — Eine Assemblersprache ist eine spezielle Programmiersprache, welche die Maschinensprache einer spezifischen Prozessorarchitektur in einer für den Menschen lesbaren Form repräsentiert. Jede Computerarchitektur hat folglich ihre eigene… …   Deutsch Wikipedia

  • Inline-Assembler — Ein Inline Assembler oder integrierter Assembler ist ein Assembler, der in den Compiler einer höheren Programmiersprache integriert ist. Mittels einer speziellen Anweisung ist hierbei Assembler Quelltext direkt in die höhere Programmiersprache… …   Deutsch Wikipedia

  • Assemblersprachen — Eine Assemblersprache ist eine spezielle Programmiersprache, welche die Maschinensprache einer spezifischen Prozessorarchitektur in einer für den Menschen lesbaren Form repräsentiert. Jede Computerarchitektur hat folglich ihre eigene… …   Deutsch Wikipedia

  • Assembley — Eine Assemblersprache ist eine spezielle Programmiersprache, welche die Maschinensprache einer spezifischen Prozessorarchitektur in einer für den Menschen lesbaren Form repräsentiert. Jede Computerarchitektur hat folglich ihre eigene… …   Deutsch Wikipedia

  • Assembley Language — Eine Assemblersprache ist eine spezielle Programmiersprache, welche die Maschinensprache einer spezifischen Prozessorarchitektur in einer für den Menschen lesbaren Form repräsentiert. Jede Computerarchitektur hat folglich ihre eigene… …   Deutsch Wikipedia

  • IPAD — • Integrierter Paket Assembler/Disassembler • Integrated Program for Aerospace (vehicle) Design NASA Luftfahrt / Weltraumfahrt …   Acronyms

  • 464 plus — Schneider CPC6128 Werbesticker der „Schneider Computer Division“ aus den 1990ern Die Amstrad CPC Serie, in Deutschland eher als Schneider CPC bekannt, war eine in den 1980er …   Deutsch Wikipedia

  • 464plus — Schneider CPC6128 Werbesticker der „Schneider Computer Division“ aus den 1990ern Die Amstrad CPC Serie, in Deutschland eher als Schneider CPC bekannt, war eine in den 1980er …   Deutsch Wikipedia

  • 6128 plus — Schneider CPC6128 Werbesticker der „Schneider Computer Division“ aus den 1990ern Die Amstrad CPC Serie, in Deutschland eher als Schneider CPC bekannt, war eine in den 1980er …   Deutsch Wikipedia

  • 6128plus — Schneider CPC6128 Werbesticker der „Schneider Computer Division“ aus den 1990ern Die Amstrad CPC Serie, in Deutschland eher als Schneider CPC bekannt, war eine in den 1980er …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”