C
class A
{
public:
int irgendwasA;
};
class B
{
public:
int irgendwasB;
void TuWas();
};
A theA;
void B::TuWas()
{
__asm
{
mov eax, this
mov ebx, [ eax + irgendwasB ] // klappt mit MS VC++
mov ebx, [ eax + B::irgendwasB ] // geht auch und besser lesbar
// (es könnte ja noch mehr irgendwasB in anderen
// namespaces geben)
/* Intel C+ streikt mit beiden anweisungen, für ihn geht:
mov abx, [ eax + B.irgendwasB ]
das klappt aber nicht mit MS VC++; also kann man folgendes tun: */
#if INTEL_COMPILER > 0
#define asm_B_irgendwasB B.irgendwasB
#else
#define asm_B_irgendwasB B::irgendwasB
#endif
mov ebx, [ eax + asm_B_irgendwasB ]
// das ist nicht unbedingt bequem, aber sicher
// aber:
mov eax, offset theA
mov ebx, [ eax + A::irgendwasA ] // mit MS VC++
// aber NICHT - mit Intel C++
// mov ebx, [ eax + A.irgendwasA ]
// offenbar kann diese Notation nur verwendet werden, wenn irgendwasA
// sowieso schon im scope der funtion liegt
}
}
/* man kann höchtens noch - in der declaration, einfügen:
class A
{
int irgendwasA;
#define asm_A_irgendwasA 0
};
der große nachteil ist, dass man die offsets hier genau kennen muss, falls A
eine abgeleitet klasse ist, verändert sich der offset nat. auch, wenn die basisklasse
verändert wird - das ist kaum praktikabel wenn mehrere entwickler beteiligt sind;
im falle des aufrufs von virtuellen funktionen kommt man allerdings sowieso nicht drum herum
*/
also: wenn jemand eine methode kennt, die auch für Intel C++ funktioniert, bitte hier posten