首頁 >後端開發 >C++ >使用基底指標暫存器的 C 內聯彙編如何避免函數呼叫開銷?

使用基底指標暫存器的 C 內聯彙編如何避免函數呼叫開銷?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-26 15:02:10512瀏覽

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

在C 內聯彙編中使用基指標暫存器避免函數呼叫開銷

在C 內聯彙編中使用基底指標暫存器(% rbp) ,遵循這個更正後的程式碼片段:

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;
}

解釋:

  • 我們使用局部變數tmp 作為內聯ASM 的緩衝區,而不是修改%RSP下面的紅色區域.
  • 紅色區域提供臨時內存,透過%[mem1]訪問,並引用%rbp(基指標暫存器)來計算正確的位址。
  • 「=m」限制(記憶體運算元)確保編譯器將tmp儲存到%[mem1]指向的記憶體。
  • 編譯器為 %[reg1] 分配暫存器。
  • “: %rbp”破壞清單通知編譯器在內聯彙編中修改 %rbp,使其能夠恢復。

附加說明:

  • 保持內聯彙編簡單,主要用於說明編譯器無法發出。使用約束而不是顯式的 mov 指令。
  • 喜歡在彙編中編寫整個函數,而不是對函數序言和結尾使用內聯彙編。
  • 考慮使用其他內嵌組譯資源,例如內嵌組譯標記 wiki和 GNU C 手冊。

以上是使用基底指標暫存器的 C 內聯彙編如何避免函數呼叫開銷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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