Frage zu inline _asm



  • warum funktioniert, dieser einfache Win API call trotz fehlerfreier Kompilierung nicht?

    #include <windows.h>
    
    int main() {
    
    	char *classname ="Progman";
    	HWND hListView=NULL;
    	_asm
    	{
                      push 0
                      push  classname
    		call FindWindow 
    
    		mov hListView, eax
    
    	}
    return 0;
    }
    


  • Was bedeutet "funktioniert nicht"?

    BTW: es hat absolut nix mit C zu tun...



  • Dieser Thread wurde von einem unserer Moderatoren verschoben,
    aus dem ANSI C Forum in das Assembler Forum.

    Für die Zukunft bitte beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • naja ich bekomm die Fehlermeldung, dass das Programm ein Problem verursacht hat und beendet werden muss.

    PS: dachte das Assembler Forum wäre für reines Assembler, deshalb konnt ich mich ned recht entscheiden.



  • Füge mal nach call FindWindow folgendes ein:

    add esp, 8



  • gleicher fehler, bah jetzt hock ich schon den ganzen tag da dran und google will auch nix ausspucken.
    Ich versteh nicht, warum z.b.
    push offset classname

    nicht zugelassen is.



    1. Windows API Funktionen sind "stdcall", also:
      - argumente über stack von rechts nach links
      - Aufrufer holt die Daten vom Stack (das "add esp, 8")

    Des weiteren ist FindWindow eine Funktion aus einer Import-Library, mithin ein Funktionszeiger. Der korrekte Syntax ist damit:

    #include <windows.h>

    int main() {
    
        char *classname ="Progman";
        HWND hListView=NULL;
        _asm
        {
            push 0
            push  classname
            call  DWORD PTR [FindWindow]
            add   esp, 8
            mov hListView, eax
        }
    return 0;
    }
    


  • peterchen schrieb:

    1. Windows API Funktionen sind "stdcall", also:
      - Aufrufer holt die Daten vom Stack (das "add esp, 8")

    BÖSER FEHLER

    Bei der Aufrufkonvention stdcall nimmt die GERUFENE Funktion (hier also FindWindow) die Parameter vom Stack. Das add esp, 8 nach dem Funktionsaufruf ist falsch!!!!

    Alle Win-API-Funktionen folgen der stdcall-Konvention. Es gibt nur eine Ausnahme, nämlich wsprinf, weil diese Funktion eine variable Parameterliste verarbeiten kann. Das wird aber nur von der Aufrufkonvention cdecl unterstützt.

    Ciao...



  • Ups sorry. Nach 12h im Job ist die MSDN immer so verschwommen 😕

    ok, also add esp, 8 raus und gut ist.



  • hmm das mit den Aufrufkonventionen hab ich noch nie gehört, wo kann man sich da schlau machen??

    ich find es irgendwie komisch, dass ich in "normalem" assembler einen api call ohne den pointer auf die funktion realisieren kann. Oder kann man da beides machen, oder lieg ich etwa komplett daneben? 🙂

    Danke jedenfalls für die Antwort, der code läuft einwandfrei.



  • Kommt beim "normalen Assembler" dann ja drauf an, wie das FindWindow - Symbol definiert ist.

    Aufrufkonventionen: steht in der MSDN drin
    __stdcall
    __cdecl
    __fastcall
    thiscall

    und dann gibt es noch ein paar hunder Macros, die diese Calling-Conventions platformspezifisch anpassen (z.B. WINAPI und CALLBACK)


Anmelden zum Antworten