Inline Assembler - mov Operanten-Grösse



  • Hallo

    //Foo ist ein Typ, welcher eine beliebige Grösse haben kann
    Foo Bar = Quux; //Quux ist eine andere Instanz von Foo
    Foo Baz;
    asm
    {[asm]
      mov &Baz, &Bar
    [/asm]}
    

    Erkennt der Inline Assembler die Grösse von Foo und wird er auch die gesamte Instanz kopieren?

    MfG, EOutOfResources



  • mov funktioniert nicht mit beliebigen Typen. Aber warum keine Zuweisung, was willst du erreichen?



  • Nexus schrieb:

    Aber warum keine Zuweisung, was willst du erreichen?

    Eine Kopie ohne den Zuweisungsoperator aufzurufen.

    EDIT: Man, was ist ein Kopieroperator? 😃



  • Was ist ein Kopieroperator? Meinst du Kopierkonstruktor oder Zuweisungsoperator?

    Und wieso sollte man das tun wollen? Poste mal eine High-Level-Beschreibung von dem, was du genau planst.



  • Einen bestimmten Byte-Bereich aus einer Instanz "abkopieren".
    Bsp.:
    Klasse A ist 40 Bytes gross.
    Ich will nun Byte 12 bis Byte 19 einer Instanz von A in eine weitere Instanz von A kopieren.



  • memcpy ?



  • Solche Operationen sollten, wenn sie denn überhaupt Sinn machen, von der Klasse Foo angeboten werden. Und dann ist memcpy das Tool der Wahl. Wenns denn nötig ist.
    Von außen auf byte 17-19 zuzugreifen und die dann auch noch in den entsprechenden Bereich eines anderen Objekts zu kopieren ist böse, unportabel und erzeugt undefiniertes Verhalten.



  • EOutOfResources schrieb:

    Ich will nun Byte 12 bis Byte 19 einer Instanz von A in eine weitere Instanz von A kopieren.

    Darf man fragen warum?



  • pumuckl schrieb:

    .Von außen auf byte 17-19 zuzugreifen und die dann auch noch in den entsprechenden Bereich eines anderen Objekts zu kopieren ist böse, unportabel und erzeugt undefiniertes Verhalten.

    Auch wenn ich den Typ selbst geschrieben habe?

    dot schrieb:

    Darf man fragen warum?

    Eine Instanz gezielt modifizieren -> Bestimmen Bereich von eine Vorlage abkopieren



  • EOutOfResources schrieb:

    dot schrieb:

    Darf man fragen warum?

    Eine Instanz gezielt modifizieren -> Bestimmen Bereich von eine Vorlage abkopieren

    Und warum kannst du dazu nicht einfach die entsprechenden Member verändern? Im Gegensatz zu irgendwelchen Hacks wär das wohldefiniert und portabel...



  • dot schrieb:

    Und warum kannst du dazu nicht einfach die entsprechenden Member verändern?

    Weil es nur Teile von Membern betrifft:

    Foo: |Member 01|Member 02          |M3|
              |Modifizieren    |
    


  • Wtf, ich hoffe dir ist klar dass das ein absoluter Hack ist!? Wenn du wirklich meinst das tun zu müssen: memcpy() ist aber natürlich total undefiniertes Verhalten...



  • dot schrieb:

    total undefiniertes Verhalten...

    Wieso? Ich habe Foo geschrieben und weiss, wie es funktioniert.



  • Klasse A ist 40 Bytes gross.
    Ich will nun Byte 12 bis Byte 19 einer Instanz von A in eine weitere Instanz von A kopieren.

    void copyA(A& dest, A const& source)
    {
      uint64_t bytes = *static_cast<const uint64_t*>(static_cast<const void*>(&source) + 11);
      *static_cast<uint64_t*>(static_cast<void*>(&dest) + 11) = bytes;
    }
    

    Gerade eben runtergetippt, sollte funktionieren.

    Bist du zufälligerweise in einem fremden Prozess/Code, zb per DLL-Injection? Wenn nicht, dann ist deine Idee grausam.



  • Ethon schrieb:

    Bist du zufälligerweise in einem fremden Prozess/Code

    Fremder Prozess, mein Code. Meine Anwendung greift auf eine andere meiner Anwendungen zu...



  • EOutOfResources schrieb:

    dot schrieb:

    total undefiniertes Verhalten...

    Wieso? Ich habe Foo geschrieben und weiss, wie es funktioniert.

    Hast du an Padding gedacht? Hast du dir tausend Kommentare geschrieben, dass niemand jemals die Klasse ändern darf?



  • EOutOfResources schrieb:

    dot schrieb:

    total undefiniertes Verhalten...

    Wieso? Ich habe Foo geschrieben und weiss, wie es funktioniert.

    Aber Compiler fügen standardmäßig Füllbits zwischen die Member Klasse / Struktur ein.
    Daher solltest du das Alignment per pragma vor die Klassendefinition auf einen wohldefinierten Wert (wenn nötig auf 1 Byte) ändern, und in deinem Code kommentieren, warum du dies gemacht hast.



  • Ups, Padding. Jetzt verstehe ich es...



  • EOutOfResources schrieb:

    dot schrieb:

    total undefiniertes Verhalten...

    Wieso? Ich habe Foo geschrieben und weiss, wie es funktioniert.

    Weil auch wenn du die Klasse selber geschrieben hast undefiniertes Verhalten dabei rauskommt, wenn du ohne über die Klassenmethoden bzw. Member zu gehen, byteweise deine Objekte vermurkst.
    Undefiniertes Verhalten heißt, es kann keine Aussage drüber gemacht werden was genau passiert.
    Wenn du deinen Compiler genau kennst und das was er an Code für deine Plattform erzeugt, dann kann das durchaus funktionieren. Es ist aber nicht garantiert, dass es auf einer anderen Plattform oder mit der nächsten Version deines Compilers auch noch funktioniert, geschweige denn mit einem anderen Compiler.


Log in to reply