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();
}