Makro zum "naked-call" einer Funktion



  • Hallo,

    ich habe folgendes Makro definiert:

    #define MemCpyEx( src, dest, cnt )						\
    	__asm {												\
    		push	ebp										\
    		mov		ebp, esp								\
    														\
    		mov		ecx, DWORD PTR [src]					\
    		mov		edx, DWORD PTR [dest]					\
    		mov		ebx, cnt								\
    														\
    		call	__MemCpyEx								\
    														\
    		mov 	esp, ebp								\
    		pop		ebp										\
    	}
    

    Bei __MemCpyEx handelt es sich um eine Funktion die mit __declspec(naked) deklariert worden ist. Das Makro enthält meinen Pro- / u. Epilog. Allerdings enthalte ich die folgende Fehlermeldung:

    error C2400: inline assembler syntax error in 'first operand'; found 'register'
    

    Es ist schwierig bei diesem Thema das richtige Subforum zu erwischen. Es handelt sich zwar um Assembler-Code, in diesem liegt aber nicht der Fehler; lediglich das Makro funktioniert nicht.



  • Hast du mal ohne diese Leerzeilen probiert? Was versuchst du überhaupt? Es sieht so aus, als ob du eine Art __fastcall -Konvention bauen willst. Und mit ebx im inline assembler zu spielen... damit hab ich nur selten gute Erfahrungen gemacht. Anyway 😮



  • /rant/ schrieb:

    Hast du mal ohne diese Leerzeilen probiert? Was versuchst du überhaupt? Es sieht so aus, als ob du eine Art __fastcall -Konvention bauen willst. Und mit ebx im inline assembler zu spielen... damit hab ich nur selten gute Erfahrungen gemacht. Anyway 😮

    Also,

    1. Ohne Leerzeilen funktioniert es auch nicht.
    2. __fastcall legt die ersten beiden Parameter (wenn DWORD aligned) in die Register ecx und edx. Ich lege hier alle Parameter in das Register, in dem ich es benötige.
    3. Hier fehlt die Sicherung vom ebx Register; generell hatte ich aber noch nie Probleme bei der Verwendung von ebx. Der Fehler kommt ja auch wo anders her.

    Wie gesagt, der Code funktioniert, wenn ich die Funktion genau so explizit aufrufe. Nur das Makro funktioniert nicht.



  • FrEEzE2046 schrieb:

    Wie gesagt, der Code funktioniert, wenn ich die Funktion genau so explizit aufrufe. Nur das Makro funktioniert nicht.

    du hast bestimmt irgendwelche blöden tabs oder sowas vor/hinter den \
    probier folgendes:
    - mach nach jeder zeile ein leerzeichen
    - dann das \
    - dann *einmal* die enter-taste
    - dann die nächste zeile usw.
    🙂



  • ;fricky schrieb:

    FrEEzE2046 schrieb:

    Wie gesagt, der Code funktioniert, wenn ich die Funktion genau so explizit aufrufe. Nur das Makro funktioniert nicht.

    du hast bestimmt irgendwelche blöden tabs oder sowas vor/hinter den \
    probier folgendes:
    - mach nach jeder zeile ein leerzeichen
    - dann das \
    - dann *einmal* die enter-taste
    - dann die nächste zeile usw.
    🙂

    Es funktioniert aber auch dann nicht, wenn ich alles in eine Zeile schreibe. Also:

    #define MemCpyEx __asm { push ebp mov ebp, esp mov ecx, DWORD PTR [src] mov edx, DWORD PTR [dest] mov ebx, cnt call __MemCpyEx mov esp, ebp pop ebp }
    

    Hier kommt die Meldung

    warning C4405: 'mov' : identifier is reserved word
    


  • FrEEzE2046 schrieb:

    Es funktioniert aber auch dann nicht, wenn ich alles in eine Zeile schreibe.

    das sollste auch nicht machen. das zeilenende ist für den msvc inline-asm schon wichtig. kannst ja mal versuchen, am ende jeder zeile ein ; zu setzen. vermute mal nicht, dass es funzt, aber vielleicht haste ja glück und es geht doch.
    🙂



  • Hier steht wie`s gemacht wird. Damit hat sich das Thema erledigt. Danke an alle!


Anmelden zum Antworten