Inline Asm - auf Element in Klasse zugreifen



  • Hey,

    Ich benutze Microsoft Visual C++ 2003, und möchte per inline asm auf ein Element einer Klasse zugreifen.

    (Beispielsweise auf lpFindFileData->cFileName)

    kann mir jemand erklären wie das geht?

    vielen dank & lg!



  • class Ding
    {
    private:
      int mBla;
    
    public:
      int bla()
      {
        _asm {
          mov ebx, this        // per default in ecx
          mov eax, [ebx].mBla
        };
      }
    };
    
    Ding* ding= new Ding;
    _asm
    {
       mov ebx, ding
       mov eax, [ebx]ding.mBla
    }
    


  • hellihjb schrieb:

    class Ding
    {
    private:
      int mBla;
    
    public:
      int bla()
      {
        _asm {
          mov ebx, this
          mov eax, [ebx].mBla
        };
      }
    };
    

    Der "this"-Zeiger wird per default in ecx uebergeben.

    sorry, habe mich vielleicht nicht ganz deutlich augedürckt.

    das ganze ist so gemeint:

    typedef struct _WIN32_FIND_DATA {
      DWORD    dwFileAttributes;
      FILETIME ftCreationTime;
      FILETIME ftLastAccessTime;
      FILETIME ftLastWriteTime;
      DWORD    nFileSizeHigh;
      DWORD    nFileSizeLow;
      DWORD    dwReserved0;
      DWORD    dwReserved1;
      TCHAR    cFileName[MAX_PATH];
      TCHAR    cAlternateFileName[14];
    }WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
    
    void kk(LPWIN32_FIND_DATA lpFindFileData)
    	{
    		__asm
    		{
    			push lpFindFileData->cFileName ; mir ist klar das das so falsch ist.... - und leider habe ich keine ahnung wie es richtig geht.
    		}
    	}
    


  • hellihjb schrieb:

    class Ding
    {
    private:
      int mBla;
    
    public:
      int bla()
      {
        _asm {
          mov ebx, this
          mov eax, [ebx].mBla
        };
      }
    };
    

    Der "this"-Zeiger wird per default in ecx uebergeben.

    Warum gehst Du dann den Umweg über ebx und schreibst nicht einfach:

    class Ding
    {
    private:
      int mBla;
    
    public:
      int bla()
      {
        _asm {
                mov eax, [ecx].mBla
        }
      }
    };
    

    🙄



  • TARGA_ schrieb:

    sorry, habe mich vielleicht nicht ganz deutlich augedürckt.

    das ganze ist so gemeint:

    typedef struct _WIN32_FIND_DATA {
      DWORD    dwFileAttributes;
      FILETIME ftCreationTime;
      FILETIME ftLastAccessTime;
      FILETIME ftLastWriteTime;
      DWORD    nFileSizeHigh;
      DWORD    nFileSizeLow;
      DWORD    dwReserved0;
      DWORD    dwReserved1;
      TCHAR    cFileName[MAX_PATH];
      TCHAR    cAlternateFileName[14];
    }WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
    
    void kk(LPWIN32_FIND_DATA lpFindFileData)
    	{
    		__asm
    		{
    			push lpFindFileData->cFileName ; mir ist klar das das so falsch ist.... - und leider habe ich keine ahnung wie es richtig geht.
    		}
    	}
    

    Gleiches Prinzip:

    void kk(LPWIN32_FIND_DATA lpFindFileData)
    {
      __asm
      {
        mov ebx, lpFindFileData
        push [ebx]lpFindFileData.cFileName
      }
    }
    

    otto8 schrieb:

    Warum gehst Du dann den Umweg über ebx und schreibst nicht einfach:

    mov eax, [ecx].mBla
    

    🙄

    Weil auch andere Calling-Conventions gelten koennen.



  • wie simpel es doch eigentlich ist 😮

    hehe, dank dir!!!



  • hellihjb schrieb:

    otto8 schrieb:

    Warum gehst Du dann den Umweg über ebx und schreibst nicht einfach:

    mov eax, [ecx].mBla
    

    🙄

    Weil auch andere Calling-Conventions gelten koennen.

    selbst ohne das kann der optimizer vom compiler was anderes in ecx reinschieben. es ist nicht gesagt dass this die ganze zeit in ecx sein wird.


Anmelden zum Antworten