Frage

Wenn Assembler-Code in ein ++ Programm C / C Einbettung können Sie vermeiden Register clobbering indem sie mit einem Push-Befehl speichern (oder clobber Liste angeben Compiler unterstützt).

Wenn Sie Montage inline sind inklusive und wollen den Aufwand für das Schieben und knallen clobbered Register zu vermeiden, gibt es eine Möglichkeit, gcc Register wählen zu lassen, für Sie (zum Beispiel diejenigen, sie weiß, in ihnen keine nützlichen Informationen haben).

War es hilfreich?

Lösung

Ja. Sie können angeben, dass Sie eine bestimmte Variable (Eingang oder Ausgang) wollen in einem Register gespeichert werden, aber Sie müssen nicht ein Register angeben. Siehe dieses Dokument für eine ausführliche Erklärung. Im Wesentlichen sieht die Inline-Assembler wie folgt aus:

asm("your assembly instructions"
      : output1("=a"),  // I want output1 in the eax register
        output2("=r"),  // output2 can be in any general-purpose register
        output3("=q"),  // output3 can be in eax, ebx, ecx, or edx
        output4("=A")   // output4 can be in eax or edx
      : /* inputs */
      : /* clobbered registers */
   );

Andere Tipps

Compiler intrinsics eine sehr nützliche Art und Weise zu Mischungsaufbau und C / C ++ Code. Sie sind Erklärungen, die wie Funktionen aussehen, aber tatsächlich kompilieren direkt an einzelne native Befehle (über einen Sonderfall innerhalb der Compiler). Dies gibt Ihnen viel von der Kontrolle der in der Montage arbeiten, lässt aber das Register Farbgebung und dem Compiler die Planung auf.

Ein Vorteil ist, dass dann können Sie ein normales C-Variable in eine intrinsischen passieren, und lassen Sie die Compiler kümmern sie auf das Register des Ladens und die Planung andere ops um ihn herum. Zum Beispiel:

struct TwoVectors
{
   __m128 a; __m128b;
}

// adds two vectors A += B using the native SSE opcode
inline void SimdADD( TwoVectors *v ) 
{
   v->a = _mm_add_ps( v->a , v->b ); // compiles directly to ADDSS opcode
}

OK, so kann ich keinen Kommentar über verlassen, aber ich bin mir ziemlich sicher, dass die richtige Syntax (verschieden von dem oben dargestellt):

asm ( "your assembly instructions"
    : "=a"(output1),
      "=r"(output2),
      "=q"(output3),
      "=A"(output4)
    : /* inputs */
    : /* clobbered registers */
);

Auch wenn Sie die Zuordnung von Eingangs- und Ausgangsregister an den Compiler verlassen können, gibt es keine offensichtliche Möglichkeit der Zuweisung von Grund auf neu / temp Register zu verlassen (das heißt für Zwischenwerte verwendet, aber kein Eingang oder Ausgang) an den Compiler. Historisch gesehen, ich aufgelistet sie nur explizit in der clobber Liste (zum Beispiel „% XMM1“, „% rcx“), aber ich denke, jetzt könnte es besser sein, sie als Ausgänge zur Liste, um den Compiler zu ermöglichen, sie zu wählen. Ich weiß nicht, von jeder Quelle, die definitiv dieses Problem behebt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top