Assemblerzugriff auf Klassenvariable



  • Hallo zusammen,

    ich habe folgendes Problem:
    Ich habe eine Kompressionsmethode, die als Inline-Assembler eingebunden ist. In dieser greife ich auch auf ein DWORD-Array zu. Solange die Variable global ist klappt das auch. Packe ich das ganze jedoch in eine Klasse, sagt mir der Compiler "Ungültiger Operandentyp". Was mache ich da falsch?

    So gehts:

    DWORD dwFeld[200];
    
    function operate()
    {
      __asm
      {
        mov  edi, OFFSET dwFeld[0]
        :
        :
      }
    }
    

    Und hier klappts nicht mehr:

    // header-Datei
    class Bsp
    {
    public:
      DWORD dwFeld[200];
    
    function operate();
    }
    
    // Implementation
    function Bsp::operate()
    {
      __asm
      {
        mov  edi, OFFSET dwFeld[0]  // ungültiger Operandentyp
        :
        :
      }
    }
    

    Wie müsste es richtig ausschauen?

    Für Hilfe bin ich schon im Voraus überaus dankbar
    Wes



  • Ok, hab es rausbekommen. Die Klassenvariablen lassen sich auf diese Art nicht adressieren, weil die Instanz der Klasse im Stack als Pointer an die Methode übergeben wird. Die Membervariablen sind zwar als Adressliste darüber ladbar, was sich jedoch nicht empfielt. Denn wenn man die Klasse ändert, kann sich u.U. auch die Position der Adresse in der Liste ändern. Darum hab ich das so gelöst:

    // header-Datei
    class Bsp
    {
    public:
      DWORD dwFeld[200];
    
    function operate();
    }
    
    // Implementation
    function Bsp::operate()
    {
      void* pFeld = &dwFeld[0];
    
      __asm
      {
        mov  edi, pFeld
        :
        :
      }
    }
    

    Einziger Nachteil: Es findet keine Typenprüfung statt. Aber damit kann man leben, wenn man sauber codet.

    Wes 🕶


Anmelden zum Antworten