Heim > Backend-Entwicklung > C++ > Wie kann C-Inline-Assembly mit dem Basiszeigerregister Funktionsaufruf-Overhead vermeiden?

Wie kann C-Inline-Assembly mit dem Basiszeigerregister Funktionsaufruf-Overhead vermeiden?

Mary-Kate Olsen
Freigeben: 2024-12-26 15:02:10
Original
512 Leute haben es durchsucht

How Can C   Inline Assembly with the Base Pointer Register Avoid Function Call Overhead?

Vermeidung des Funktionsaufruf-Overheads mit Basiszeigerregister in C-Inline-Assembly

Zur Nutzung des Basiszeigerregisters (%rbp) in C-Inline-Assembly , folgen Sie diesem korrigierten Code Snippet:

void Foo(int &x) {
    int tmp;
    long tmplong;
    asm volatile(
        "lea -16 + %[mem1], %%rbp\n\t"
        "imul , %%rbp, %q[reg1]\n\t"  // Register allocated to tmplong
        "add %k[reg1], %k[reg1]\n\t"    // Register allocated to tmp
        "movl , %[mem1]\n\t" // Store value in memory pointed to by tmp
        : [mem1] "=&m"(tmp), [reg1] "=r"(tmplong)
        :
        : "%rbp"
    );
    x = 5;
}
Nach dem Login kopieren

Erklärung:

  • Anstatt den roten Bereich unter %RSP zu ändern, verwenden wir eine lokale Variable tmp als Puffer für Inline-ASM .
  • Arbeitsspeicher wird im roten Bereich bereitgestellt, auf den über %[mem1] und Referenzen zugegriffen wird %rbp (Basiszeigerregister), um die richtige Adresse zu berechnen.
  • Die Einschränkung „=m“ (Speicheroperand) stellt sicher, dass der Compiler tmp in dem Speicher speichert, auf den %[mem1] zeigt.
  • Register werden vom Compiler für %[reg1] zugewiesen.
  • Die Clobber-Liste „: %rbp“ informiert den Compiler darüber %rbp wird innerhalb der Inline-Assembly geändert und ermöglicht so deren Wiederherstellung.

Zusätzliche Hinweise:

  • Halten Sie die Inline-Assembly einfach, vor allem für Anweisungen, die die Der Compiler kann nicht ausgeben. Verwenden Sie Einschränkungen anstelle expliziter MOV-Anweisungen.
  • Schreiben Sie lieber ganze Funktionen in Assembly, als Inline-Assembly für Funktionsprologe und Epiloge zu verwenden.
  • Erwägen Sie die Verwendung anderer Inline-Assembly-Ressourcen wie das Inline-Assembly-Tag-Wiki und das GNU C-Handbuch.

Das obige ist der detaillierte Inhalt vonWie kann C-Inline-Assembly mit dem Basiszeigerregister Funktionsaufruf-Overhead vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage