[VC9] Warum werden manche Calls so seltsam übersetzt?



  • Ich bin kein Assembler-Profi, aber um einen etwas besseren Durchblick zu bekommen, hab ich eine einfache DLL von mir disassembelt und eine Sache ist mir aufgefallen:
    Normalerweise wird eine Funktion ja so aufgerufen:

    push ...
    push ...
    call Die_Funktion
    

    Bei manchen Funktionen ( unter anderem Direct3DCreate9 ) passiert allerdings Folgendes:

    push ...
    call jump_Direct3DCreate9
    
    ...
    
    jump_Direct3DCreate9:
          call D3D9.dll_Direct3DCreate9
    

    Zuerst wird zum Label gesprungen und dann erst die Funktion in der DLL aufgerufen. Ist aber nicht bei allen Funktionen so. Welchen Sinn hat das?

    PS: Tut mir Leid, wenn ich besser im Assembler-Forum hätte posten sollen, aber ich dachte mir, dass es am Compiler ( VC9 ) liegt.



  • Das sind Thunks für Funktionen, die aus DLLs importiert wurden.



  • Hab's mal bei Wikipedia nachgeschlagen, allerdings versteh ich immer noch nicht ganz, wozu Thunks gut sind bzw. warum manche importierte Funktionen sowas brauchen und manche nicht.



  • eine erklärung könnte edit&continue sein, damit man funktionen ändern kann ohne überall die adressen zu suchen.

    Eine andere möglichkeit ist, dass es fürs debuggen ist, -> zentrale stelle + breakpoint...???

    Oder es ist zum platzspaten da, da im programm die schmalen call instruktionen genutzt werden können und nur an einer stelle eine 4/8 bit adresse/offset vorkommt.



  • Danke, wurst 🙂
    Klingt plausibel.


Anmelden zum Antworten