E
Probier mal dies aus:
http://www.henkessoft.de/C++/Cpp_school/asm.htm
Im Programm findest Du die AT&T-Syntax, die von code::blocks verwendet wird:
__asm("mov _b, %eax"); //AT&T Syntax
__asm("mov _a, %ebx");
__asm("mov %eax, _a");
__asm("mov %ebx, _b");
... die man mit etwas Geschick in die Intel-Syntax umwandeln kann:
_asm
{
mov eax, b
mov ebx, a
mov a, eax
mov b, ebx
}
Programm mit code::blocks getestet, läuft erfolgreich:
#include <iostream>
#include <conio.h> //nur fuer Windows
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++ und code::blocks
__asm("mov _a, %ebx");
__asm("mov %eax, _a");
__asm("mov %ebx, _b");
ausgabe();
getch(); //nur fuer Windows
}
output:
Ausgangssituation:
0x442000: 1 0x442004: 2
Tausch mittels std::swap(x,y):
0x442000: 2 0x442004: 1
Tausch mittels Zeiger:
0x442000: 1 0x442004: 2
Tausch mittels Referenzen:
0x442000: 2 0x442004: 1
Erfolgloser Tausch, da nur lokale Kopien getauscht werden.
Kopien auf dem Stack:
0x22ff50: 2 0x22ff54: 1
0x22ff50: 1 0x22ff54: 2
swap nur lokal erfolgreich.
0x442000: 2 0x442004: 1
Tausch von a und b mittels Register eax und ebx:
0x442000: 1 0x442004: 2
Weiß jemand, ob und wie man AT&T- und Intel-Syntax bei code::blocks umschalten kann?