VC++ Inline Assembler Problem



  • Hi! 😉

    Ich wollte eine Reihe an Funktionen schreiben, um per C++ auf Windows Plattformen Syscalls ausführen zu können.

    Als erstes hab ich eine entsprechende Funktion für Syscalls mit 0 Parametern (welcher wohl nicht existiert) getippt:

    inline std::uintptr_t syscall(const std::uintptr_t code)
    {
    	std::uintptr_t result;
    
    	__asm
    	{
    #ifdef _M_IX86
    		pushad
    		mov eax, code
    		sysenter
    		mov result, eax
    		popad
    #elif defined _M_AMD64
    		push rax
    		mov rax, code
    		sysenter
    		mov result, rax
    		pop rax
    #endif
    	}
    
    	return result;
    }
    

    Das kompiliert aber leider nicht,

    error C2400: inline assembler syntax error in 'opcode'; found 'newline'

    tritt in der Zeile mit 'sysenter' auf.
    Kommentiere ich diese Zeile aus, dann funktioniert es.

    Was könnte das Problem sein?
    Danke schon mal und Grüße



  • Ich kann dir nicht sicher sagen was der Fehler ist, vermutlich kennt MSVC entweder pushad/popad oder sysenter/sysexit nicht. Allerdings frag ich mich: Wofür soll das gut sein? Und ich sollte dich wohl drauf hinweisen dass MSVC inline Assembler für x64 nicht unterstützt.



  • dot schrieb:

    Allerdings frag ich mich: Wofür soll das gut sein?

    Und wieder kommt dot mit seinen Meta Fragen daher. 🙄

    User stellt Frage X.
    Dots Antwort: Brauchst du das wirklich? Sieht nach schlechtem Design aus.

    🙄 🙄



  • Der Code funktioniert definitiv unter x64 nicht, da es keinen Inline-Assembler gibt. Deswegen ist die Frage sehr wohl angebracht, wenn der OP explizit das x64 in seinem Posting hat.



  • Das Ganze ist eigentlich nur ein Experiment. 😉

    Ich kann dir nicht sicher sagen was der Fehler ist, vermutlich kennt MSVC entweder pushad/popad oder sysenter/sysexit nicht.

    pushad/popad machen ja wie gesagt keine Probleme.
    Und Code mit sysenter hab ich bereits hier im WinAPI Forum mal gesehen, da hat jemand per Inline Assembler NtCopyVirtualMemory benutzt.
    Deswegen frage ich mich ja, warum das ausgerechnet bei mir nicht klappt.

    Allerdings frag ich mich: Wofür soll das gut sein?

    Naja, imo der schönste Weg ntdll Hooks zu bypassen.

    Und ich sollte dich wohl drauf hinweisen dass MSVC inline Assembler für x64 nicht unterstützt.

    Wusste ich nicht. Wie begründet Microsoft das Fehlen eines so wichtigen Features?



  • Der Inline Assembler ist heute praktisch bedeutungslos. Unter x86-32 haben die meisten Programmierer ihn noch für SSE verwendet, wofür es jedoch bereits standardisierte Intrinsics gibt. Auf x64 wird SSE sowieso immer genutzt und es sind noch weniger Funktionen des Prozessors frei nutzbar. Deshalb braucht man ihn praktisch überhaupt nicht mehr.

    Wenn du wirklich Assembler brauchst, kannst du masm oder noch besser nasm benutzen und dir separate Module schreiben. Geht auch unter x64 problemlos; man muss nur wissen, was man tut. Sprich um die Calling Conventions etc. kannst du dich gleich selbst kümmern. Microsoft beschreibt jedoch sehr gut, wie diese aussehen.



  • Exakt, für die wichtigen Dinge gibts Intrinsics und damit ist man sowieso besser beraten (Performance, Portabilität, ...). Für irgendwelche Spezialfälle muss man halt einen richtigen Assembler auspacken. Ich halte inline Assembler jedenfalls bei weitem für kein so wichtiges Feature mehr...

    Ethon schrieb:

    Allerdings frag ich mich: Wofür soll das gut sein?

    Naja, imo der schönste Weg ntdll Hooks zu bypassen.

    Ok, du wirst schon deine Gründe haben warum du das um jeden Preis tun musst...


Anmelden zum Antworten