Inline Assembler: Memberzugriff



  • Hi,
    ich versuche in einer Methode einer Klasse in einem Assembler Abschnitt direkt auf eine Member Variable selbiger zuzugreifen - leider vergebens.
    Bps.:

    class A
    {
    private:
    	int m_Int;
    
    public:
    	void SetInt(int Value)
    	{
    		__asm
    		{
    			mov eax, Value
    			mov m_Int, eax	// error C2420: 'm_Int' : Unzulaessiges Symbol in Erster Operand
    		}					// error C2415: Ungueltiger Operandentyp
    	}
    };
    

    Mir ist schon klar, dass ich es auch ueber zusaetzliche lokale Variablen realisieren kann, aber ich versteh nicht, warum es nicht direkt geht.
    Woran koennte das liegen? Was mache ich falsch? (Benutze Visual Studio 6.0)

    Gruss,
    DeSoVoDaMu



  • DeSoVoDaMu schrieb:

    ... ich versteh nicht, warum es nicht direkt geht.
    Woran koennte das liegen? Was mache ich falsch? (Benutze Visual Studio 6.0)

    Jede nichtstatische Methode einer Klasse bekommt als ersten Parameter den Zeiger auf die zugehörige Klasse geliefert, der als this zur Verfügung steht. Der Compiler setzt also den Aufruf classobj.classmember (arg) zu etwas wie classmember (&classobj, arg) um, davon bekommst du aber nichts mit. Elemente einer Klasse sind auch in ihrer Position abhängig von diesem this-pointer, weswegen dieser Zugriff

    class c1
    {
    protected:
        int elem;
    public:
        int Elem (void)
        {
            return (elem);
        }
    };
    

    eine Kurzschreibweise für diesen ist:

    class c2
    {
    protected:
        int elem;
    public:
        int Elem (void)
        {
            return (this->elem);
        }
    };
    

    Was durch das Klassenelement gegeben ist, ist der Offset von this - und diesen versucht dein Assembler-Code als absolute Adresse zu verwenden. Du mußt es folglich so machen:

    class A
    {
    private:
        int m_Int;
    
    public:
        void SetInt(int Value)
        {
            __asm
            {
                mov eax,Value
                mov ebx,this
                mov [ebx],eax // m_Int hat Offset 0; ich würde mich im Allgemeinen aber nicht drauf verlassen
            }
        }
    };
    

    Moritz



  • Hm...da haette ich auch selbst drauf kommen koennen 🙂

    Aber vielen Dank!

    Gruss,
    DeSoVoDaMu


  • Mod

    es gibt zwei syntax möglichkeiten die sowohl vom intel c++ für windows als auch visual c++ verstanden werden (bei jedem von ihnen gehen noch ein paar andere die vom andren compiler nicht verstanden werden).

    class A
    {
    private:
        int m_Int;
    
    public:
        void SetInt(int Value)
        {
            __asm
            {
                mov eax,Value
                mov ebx,this
                mov [ebx]A.m_Int,eax
            }
        }
    };
    

    oder

    [cpp]class A
    {
    private:
        int m_Int;
    
    public:
        void SetInt(int Value)
        {
            __asm
            {
                mov eax,Value
                mov ebx,this
                mov A::m_Int[ebx],eax
            }
        }
    };
    

    der inline assembler ignoriert im übrigen zugriffsbeschränkungen, man kann also von überall her auf private member zugreifen - hier ist also ein wenig vorsicht angebracht.


Anmelden zum Antworten