C++ und assembler


  • Mod

    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 🙂


Anmelden zum Antworten