首頁 >後端開發 >C++ >為什麼使用基指標暫存器 (%rbp) 的內聯彙編會導致 C 中的段錯誤?

為什麼使用基指標暫存器 (%rbp) 的內聯彙編會導致 C 中的段錯誤?

Patricia Arquette
Patricia Arquette原創
2024-12-28 02:17:10592瀏覽

Why Does My Inline Assembly Using the Base Pointer Register (%rbp) Cause a Seg Fault in C  ?

在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 的最佳實務:

  • 保持內嵌ASM 盡可能簡潔,最好只包含編譯器無法產生的指令。
  • 使用輸入/輸出限制來指定流程ASM 和 C 程式碼之間的資料。
  • 避免對大型程式碼區塊使用內嵌 ASM。考慮編寫彙編函數。

其他提示:

  • 使用內聯 ASM 時,請注意堆疊下方的「紅色區域」區域指標。
  • 輸入約束可用來指定輸入的暫存器,減少明確暫存器的需要分配。
  • 如果您的程式碼修改了標誌,請聲明「cc」(條件代碼)破壞者。

以上是為什麼使用基指標暫存器 (%rbp) 的內聯彙編會導致 C 中的段錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn