在C 內聯ASM 中使用基指針寄存器
問題:
我正在嘗試在內聯組譯中使用基址指標暫存器(%rbp)。但是,當我在內聯彙編之後存取變數時,程式段錯誤。下面的程式碼片段說明了這個問題:
void Foo(int &x) { asm volatile ("pushq %%rbp;" "movq %%rsp, %%rbp;" "subq , %%rsp;" "movl , -12(%%rbp);" "movq %%rbp, %%rsp;" "popq %%rbp;" : : : ); x = 5; }
問題診斷:
程式碼段錯誤,因為它覆蓋了RSP 下面「紅色區域」中儲存的值,GCC使用它來儲存
解決方案:
要避免此問題,請使用「=m」輸出運算元為內嵌彙編指派暫存空間,或使用明確跳過紅色區域sub $-128, %rsp 指令。或者,首先避免使用暫存空間,讓編譯器為您指派和儲存暫存器。
內嵌 ASM 的最佳實務:
其他提示:
以上是為什麼使用基指標暫存器 (%rbp) 的內聯彙編會導致 C 中的段錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!