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!