64 bit Assembler convert zu c++



  • Hallo,
    ich stelle momentan ein projekt von 32bit zu 64 bit um.
    Kann mir jemand helfen, wie ich in meiner 64 bit Konfiguration folgenden Code mit Hilfe einer .asm Datei übersetzen kann?

    .cpp Datein

    unsigned long get_idt_base(void)
    {
    	unsigned char	idtr[6] = {0};
    	unsigned long	idt = 0;
    
    	//testfunktion();
    	_asm sidt idtr
    	idt = *((unsigned long *) &idtr[2]);
    	
    	return (idt);
    }
    

    .asm Datei:

    .code
    testfunktion proc
    ret
    testfunktion endp
    end

    In der "testfunktion" soll dann der Code: _asm sidt idtr stehen..

    Besten Dank!



  • Das wird wohl vom Betriebssystem und vom Compiler abhängen.

    Was ist denn das Problem? Für 32 Bits hast du ja eine Lösung, was daran funktioniert mit 64 Bit nicht mehr?


  • Mod

    Deine Frage wirkt ein wenig uneindeutig. Geht es darum, eine bestimmte Assembler Sequenz im C++ Program einzubetten? Dann schau dir mal inline assembly an.



  • Ich würde mir mal die Intrinsics anschauen und was der Compiler anbietet. Das ist natürlich compilerabhängig, inline-asm jedoch ebenfalls (falls es überhaupt für 64Bit unterstützt wird).
    Für VS.
    Und speziell sidt.



  • Bei dem "etwas uneindeutig" meiner Vorposter schliesse ich mich an. Willst du nur, dass es funktioniert, oder soll das am Ende explizit eine externe Assembler-Funktion sein?

    Wenns "nur funktionieren" soll, dann schau dir mal die SIDT-Instruktion an, da steht:

    In 64-bit mode, the operand size fixed at 8+2 bytes. The instruction stores 8-byte base and 2-byte limit values.

    Die Basisadresse, die du in deinem Code in einen unsigned long schreibst, ist in 64-Bit-Code 8 Bytes lang und die SIDT-Instruktion schreibt insgesamt 10 Bytes in den Puffer (Basisadresse + Limit).

    Die direkteste Lösung ist wahrscheinlich, idtr 10 Bytes groß zu machen und den Rückgabewert in einen std::uint64_t zu schreiben.

    Wenn es unbedingt externes Assembler sein muss dann könnte das hier funktionieren:

    .code
    get_idt_base64 proc
    sidt [rbp - 10]       ; Schreibe IDT-Register in Stack-Speicherbereich
    mov rax, [rbp - 8]    ; Lade Basisadresse aus Stack in RAX (Rückgabewert)
    ret
    get_idt_base64 endp
    end
    

    Einbinden mit:

    extern "C" {
        extern __stdcall std::uint64_t get_idt_base64();
    }
    

    Müsste wie get_idt_base funktionieren.
    Das ist aber absolut ungetestet sowas mache ich nicht jeden Tag 😉

    Und ja, das von @yahendrik erwähnte __sidt in intrin.h ist wahrscheinlich die simpelste und zuverlässigste Lösung, wenn du sowieso schon mit VS arbeitest und das nicht großartig portabel sein muss.



  • @manni66 & @Columbo habt ihr schonmal probiert inline Assembler mit Visual Studio in einem 64 Bit Programm zu verwenden? Det geht nämlich nicht.



  • @hustbaer sagte in 64 bit Assembler convert zu c++:

    @manni66 & @Columbo habt ihr schonmal probiert inline Assembler mit Visual Studio in einem 64 Bit Programm zu verwenden? Det geht nämlich nicht.

    Kaputt oder not implemented? Ich muss zugeben, das selbst nur mit GCC gemacht zu haben. Dass sowas auch mit MSVC geht, habe ich bisher immer "einfach angenommen" 😉



  • @hustbaer sagte in 64 bit Assembler convert zu c++:

    @manni66 & @Columbo habt ihr schonmal probiert inline Assembler mit Visual Studio in einem 64 Bit Programm zu verwenden? Det geht nämlich nicht.

    Nein. Von VS steht hier auch nichts.



  • @manni66 sagte in 64 bit Assembler convert zu c++:

    Nein. Von VS steht hier auch nichts.

    Zwar nicht direkt, aber der Assembler-Teil sieht mir sehr nach MS-Assembler aus. VS habe ich hier einfach implizit angenommen - kann mich aber auch vertun 😉



  • @hustbaer sagte in 64 bit Assembler convert zu c++:

    habt ihr schonmal probiert inline Assembler mit Visual Studio in einem 64 Bit Programm zu verwenden? Det geht nämlich nicht.

    wahrscheinlich nur so lange, bis kein drittanbieter eine eine entsprechende extension anbietet.



  • Das braucht man nicht, man kann Assembler recht problemlos dazulinken. Nur inline geht es halt nicht. Nervig, aber kein Weltuntergang.



  • @Bushmaster sagte in 64 bit Assembler convert zu c++:

    wahrscheinlich nur so lange, bis kein drittanbieter eine eine entsprechende extension anbietet.

    cl kann es nicht und kennt auch keine Extensions.



  • @manni66 Kennst du einen anderen Compiler mit dem _asm sidt idtr einfach so mitten in einer Funktion geht?



  • Aber ja, @spiegelbirke1, wenn du so Misverständnisse in Zukunft vermeiden willst, dann wäre es gut im richtigen Forum zu posten und/oder dazuzuschreiben warum du bei der Umstellung von 32 auf 64 Bit überhaupt was ändern musst. Also in diesem Fall vermutlich dass MSVC im 64 Bit Mode eben keinen inline Assembler "kann".



  • @Bushmaster sagte in 64 bit Assembler convert zu c++:

    @hustbaer sagte in 64 bit Assembler convert zu c++:

    habt ihr schonmal probiert inline Assembler mit Visual Studio in einem 64 Bit Programm zu verwenden? Det geht nämlich nicht.

    wahrscheinlich nur so lange, bis kein drittanbieter eine eine entsprechende extension anbietet.

    Der "Fachliche" Teil wurde ja schon von @Swordfish abgedeckt. Davon abgesehen macht der Satz aber auch keinen sinn. "nur so lange, bis kein drittanbieter" - hä? Wenn du das ",bis " weglässt, dann wird ein Schuh draus.





  • @hustbaer sagte in 64 bit Assembler convert zu c++:

    @Bushmaster sagte in 64 bit Assembler convert zu c++:

    @hustbaer sagte in 64 bit Assembler convert zu c++:

    habt ihr schonmal probiert inline Assembler mit Visual Studio in einem 64 Bit Programm zu verwenden? Det geht nämlich nicht.

    wahrscheinlich nur so lange, bis kein drittanbieter eine eine entsprechende extension anbietet.

    Der "Fachliche" Teil wurde ja schon von @Swordfish abgedeckt. Davon abgesehen macht der Satz aber auch keinen sinn. "nur so lange, bis kein drittanbieter" - hä? Wenn du das ",bis " weglässt, dann wird ein Schuh draus.

    es ist doch möglich, dass jemand die fehlende x64-assembler-unterstützung als mangel empfindet und ein plugin baut.



  • @Swordfish sagte in 64 bit Assembler convert zu c++:

    cl kann es nicht und kennt auch keine Extensions.

    visual studio ist erweiterungsfähig. eine x64-asm-unterstützung wäre möglich. vielleicht nicht als inline-assembler, aber so old-school mäßig .asm-dateien zu .obj compilieren.



  • @Bushmaster sagte in 64 bit Assembler convert zu c++:

    es ist doch möglich, dass jemand die fehlende x64-assembler-unterstützung als mangel empfindet und ein plugin baut.

    IMO sollte ein Inline-Assembler voll in den Compiler integriert sein, damit die Assembler-Passagen auch an Code-Transformationen für Optimierungen (Inlining, Umsortieren der Instruktionen und sowas) oder solchen Sachen wie Register-Allokationen teilnehmen können (GCC macht das z.B.).

    Das zu implementieren ist schon aufwändig - andernfalls wäre aber der einzige Vorteil, dass man den ASM-Code dann eben in der .cpp stehen hat (wenn man das überhaupt als Vorteil sieht). Das fände ich nicht der Mühe wert.



  • @Finnegan sagte in 64 bit Assembler convert zu c++:

    Das zu implementieren ist schon aufwändig

    für jemanden, der einen c++ compiler programmiert, wohl eher nicht. 🙂

    aber ohne ihn belästigen müssen, können andere leute compiler für andere sprachen schreiben. dem linker ist es letztlich egal, welcher compiler eine .obj-datei erzeugt hat.


Log in to reply