Assembler-Variablen übergeben (Inline-Assembler)



  • Hallo COM,

    1.)
    man kann ja mit:

    asm{
    ASM-Code...
    }
    

    direkt ASM-Code in dem eigenen C++-Programm verwenden.
    Beim C++Builder kann man ja im ASM-Code direkt auf mit C++-Quellcode erstellten Variablen zugreifen. Doch wie kann man auf Variablen, die im ASM-Code deklariert wurden im C++Quellcode zugreifen.

    Bsp. ich lasse via ASM zwei drei Werte addieren und stecke dieses Ergebnis in eine Variable (also alles ASM). Dann erstelle ich mir eine Variable im ASM-Code, in welche dann das Ergebnis hineinkommt. Jetzt würde ich gerne noch auf diese Variable im späteren C++-Code zugreifen.

    2.)
    Der c++Builder unterstützt ja nicht die ISO-standardisierte Syntax, um via inline-assmebler asm-Code in C++-Code einzubinden.

    Hier die ISO-Syntax:

    asm("assembler code");
    

    Hier die Syntaxen, welche im c++Builder zur Verfügung stehen:
    [/asm]asm <opcode> <operanden> <; oder neue-zeile>
    _asm <opcode> <operands> <; oder neue-zeile>
    __asm <opcode> <operands> <; oder neue-zeile>[asm]

    Hier ein kleines Beispiel:

    #include <stdio.h>
    #include <iostream.h>
    
    int ausgang = 4;
    int plus = 1;
    
    void main()
    {
    /*   //geht nicht, obwohl ISO-Standard
    asm(
    mov eax,ausgang
    add eax,plus
    mov ausgang,eax
    )
    */
    
    asm{          //geht, obwohl nicht ISO-Standard
    mov eax,ausgang
    add eax,plus
    mov ausgang,eax
    }
    cout << ausgang;
    getchar();
    }
    

    3.)
    Wie kann man die ISO-Syntax hierfür im c++Builder integrieren?

    Vielen Dank im Voraus!!!

    Gruß

    Kevin 🙂 🙂 🙂 🙂 🙂 🙂 🙂



  • Hat denn keiner dazu eine Antwort?



  • Schlitzauge schrieb:

    Doch wie kann man auf Variablen, die im ASM-Code deklariert wurden im C++Quellcode zugreifen.

    Definiere die Variablen einfach im umliegenden C++-Code und weise sie im Assembler-Code zu.

    Schlitzauge schrieb:

    Wie kann man die ISO-Syntax hierfür im c++Builder integrieren?

    Gar nicht. Die wird meines Wissens fast nur von Compilern mit GCC-basiertem Frontend unterstützt.



  • Definiere die Variablen einfach im umliegenden C++-Code und weise sie im Assembler-Code zu.

    Wenn man mein obiges Beispiel genauer anschaut, gehe ich ja genau so vor, d.h. ich nutze per C++-Code definierte Variablen (im Beispiel ausgang und plus) im ASM-Code.
    Nun möchte ich allerdings das umgekehrt auch nutzen können, dass per ASM deklarierte / definierte Variablen im C++-Code nutzen, etwa, dass ich z.B. cax für if, Schleifen, Case-Abfragen oder ich die darinstehenden Werte in c++-komform-definierte Variablen stecke.

    4.)
    Dazu habe ich gleich noch ne Frage:
    Es ist zwar sehr komfortabel, dass man beim C++-Builder im ASM-Code-(Block) C++-definierte Variablen nutzen kann, jedoch ist dies nicht ISO-konform.
    deshalb würde ich gerne wissen, wie dabei der C++-Builder vorgeht, also wie dieser im Hintergrund aus der C++-Variable eine ASM-Variable macht, sodass ich das auch selber programmieren kann?

    Gar nicht. Die wird meines Wissens fast nur von Compilern mit GCC-basiertem Frontend unterstützt.

    Weiß nicht obs funzt, aber wäre nicht die Lösung dafür einen eigenen Namespace zu schreiben, in dem die besagte ISO-Syntax sehr wohl auch im C++-Builder funktioniert (natürlich würde im Hintergund (im Namespace) wieder die Syntax für ASM-Code des C++-Builders genutzt, dennoch kann man dann den Quellcode beliebig weitergeben (man müsste dann halt nur den Namespace wieder entfernen)?

    Gruß

    Schlitzauge 🙂 🙂 🙂 🙂



  • Schlitzauge schrieb:

    deshalb würde ich gerne wissen, wie dabei der C++-Builder vorgeht, also wie dieser im Hintergrund aus der C++-Variable eine ASM-Variable macht, sodass ich das auch selber programmieren kann?

    Schau doch einfach selbst im Disassembler, welche Opcodes der BCC für deinen C++-Code generiert.

    Du kannst darüber hinaus, sofern die Borland-Erweiterungen aktiviert sind, in C++-Code mit _EAX, _EBX etc. direkt auf die Register zugreifen.

    Weiß nicht obs funzt, aber wäre nicht die Lösung dafür einen eigenen Namespace zu schreiben, in dem die besagte ISO-Syntax sehr wohl auch im C++-Builder funktioniert (natürlich würde im Hintergund (im Namespace) wieder die Syntax für ASM-Code des C++-Builders genutzt, dennoch kann man dann den Quellcode beliebig weitergeben (man müsste dann halt nur den Namespace wieder entfernen)?

    Ich kann dir nicht folgen. Wenn du einen eigenen Präprozessor für diesen Zweck erstellst, mag es sein, daß du Inline-Assembler so schreiben kannst, daß er mit BCC, GCC und MSVC auf Windows gleichermaßen funktioniert, aber grundsätzlich ist Inline-Assembler ungefähr das systemspezifischste, was du machen kannst, nicht nur weil die Interaktion mit dem C++-Code von Compiler zu Compiler unterschiedlich gelöst ist.

    Was das aber mit Namespaces zu tun haben soll, entgleitet meinem Auffassungsvermögen vollständig.


Anmelden zum Antworten