Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah C Inline Assembly dengan Daftar Penunjuk Asas Mengelakkan Overhed Panggilan Fungsi?

Bagaimanakah C Inline Assembly dengan Daftar Penunjuk Asas Mengelakkan Overhed Panggilan Fungsi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-26 15:02:10512semak imbas

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

Mengelakkan Overhed Panggilan Fungsi dengan Daftar Penunjuk Asas dalam Himpunan Sebaris C

Untuk menggunakan daftar penuding asas (%rbp) dalam pemasangan sebaris C , ikut kod yang diperbetulkan ini coretan:

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

Penjelasan:

  • Daripada mengubah suai zon merah di bawah %RSP, kami menggunakan tmp pembolehubah tempatan sebagai penimbal untuk ASM sebaris .
  • Memori calar disediakan dalam zon merah, diakses melalui %[mem1] dan merujuk %rbp (daftar penuding asas) untuk mengira alamat yang betul.
  • Kekangan "=m" (operand memori) memastikan pengkompil menyimpan tmp ke memori yang ditunjuk oleh %[mem1].
  • Pendaftar diperuntukkan oleh pengkompil untuk %[reg1].
  • The ": %rbp" senarai clobber memberitahu pengkompil bahawa %rbp diubah suai di dalam pemasangan sebaris, membolehkan pemulihannya.

Nota Tambahan:

  • Pastikan pemasangan sebaris mudah , terutamanya untuk arahan yang tidak boleh dikeluarkan oleh pengkompil. Gunakan kekangan dan bukannya arahan mov yang jelas.
  • Lebih suka menulis keseluruhan fungsi dalam pemasangan daripada menggunakan pemasangan sebaris untuk prolog dan epilog fungsi.
  • Pertimbangkan untuk menggunakan sumber pemasangan sebaris lain seperti wiki teg pemasangan sebaris dan Manual GNU C.

Atas ialah kandungan terperinci Bagaimanakah C Inline Assembly dengan Daftar Penunjuk Asas Mengelakkan Overhed Panggilan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn