asm, _asm, __asm

Dieses Schlüsselwort wird von C++ genutzt, um Assembleranweisungen in den Sourcecode einzufügen.  Hierbei gibt es sowohl den Intel- als auch den AT&T-Standard für die Darstellung des Assemblercodes.

Zunächst ein Beispiel für den Compiler Dev-C++, der die AT&T Syntax verwendet:

#include <iostream>
#include <conio.h>
using std::cout;
using std::endl;

//globale Variablen
int a = 1;
int b = 2;

void ausgabe()
{
    cout << &a << ": " << a << "\t " << &b << ": " << b  << endl << endl;
}

void erfolgloser_swap( int x, int y )
{
  cout << "Kopien auf dem Stack: " << endl;
  cout << &x << ": " << x << "\t " << &y << ": " << y << endl;

  int temp = x;
  x = y;
  y = temp;
 
  cout << &x << ": " << x << "\t " << &y << ": " << y << endl;
  cout << "swap nur lokal erfolgreich." << endl;
}

void zeiger_swap( int * x, int * y ) // C-Lösung
{
  int temp = *x; // Inhalts-Operator // Dereferenzierungs-Operator
  *x = *y;
  *y = temp;
}

void referenzen_swap( int & x, int & y ) // C++-Lösung
{
  int temp = x;
  x = y;
  y = temp;
}

int main()
{
    cout << "Ausgangssituation: " << endl;
    ausgabe();

    cout << "Tausch mittels std::swap(x,y): " << endl;           
    std::swap(a,b); // Methode der Wahl aus der STL
    ausgabe();
       
    cout << "Tausch mittels Zeiger: " << endl;           
    zeiger_swap(&a, &b);
    ausgabe();
   
    cout << "Tausch mittels Referenzen: " << endl;           
    referenzen_swap(a,b);
    ausgabe();

    cout << "Erfolgloser Tausch, da nur lokale Kopien getauscht werden." << endl;           
    erfolgloser_swap(a,b);
    ausgabe();

    cout << "Tausch von a und b mittels Register eax und ebx: " << endl;        
    //swap (a,b)
    __asm("mov _b, %eax"); //AT&T Syntax bei Dev-C++
    __asm("mov _a, %ebx");
    __asm("mov %eax, _a");
    __asm("mov %ebx, _b");
    ausgabe();

    getch();
}

siehe: asm (MSDN)    inline-Assembler (MSDN)

... und jetzt zum Vergleich der gleiche Code wie oben mit der inzwischen üblicheren Intel-Syntax (z.B. für VC++ 2005 Express):

    cout << "Tausch mittels Register eax und ebx: " << endl;        
    //swap (a,b)
    _asm
    {
        mov eax, b
        mov ebx, a
        mov a, eax     
        mov b, ebx

    }