Heim >Backend-Entwicklung >C++ >Warum verursacht meine Inline-Assembly, die das Basiszeigerregister (%rbp) verwendet, einen Seg-Fehler in C?
Verwendung des Basiszeigerregisters in C Inline ASM
Frage:
Ich versuche es um das Basiszeigerregister (%rbp) innerhalb der Inline-Assembly zu verwenden. Wenn ich jedoch nach dem Inline-ASM auf die Variable zugreife, tritt im Programmsegment ein Fehler auf. Der folgende Codeausschnitt veranschaulicht das Problem:
void Foo(int &x) { asm volatile ("pushq %%rbp;" "movq %%rsp, %%rbp;" "subq , %%rsp;" "movl , -12(%%rbp);" "movq %%rbp, %%rsp;" "popq %%rbp;" : : : ); x = 5; }
Problemdiagnose:
Das Codesegment weist einen Fehler auf, weil es einen im „roten Bereich“ unter RSP gespeicherten Wert überschreibt , die GCC zum Speichern von a verwendet Wert.
Lösung:
Um dieses Problem zu vermeiden, weisen Sie Arbeitsspeicher für Ihren Inline-ASM zu, indem Sie einen „=m“-Ausgabeoperanden verwenden, oder überspringen Sie explizit die rote Zone mit die sub $-128, %rsp-Anweisung. Alternativ können Sie die Verwendung von Scratch-Speicherplatz von vornherein vermeiden und den Compiler die Zuweisung und Speicherung von Registern für Sie überlassen.
Best Practices für Inline-ASM:
Zusätzliche Tipps:
Das obige ist der detaillierte Inhalt vonWarum verursacht meine Inline-Assembly, die das Basiszeigerregister (%rbp) verwendet, einen Seg-Fehler in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!