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
Lepaskan: 2024-12-26 15:02:10
asal
582 orang telah melayarinya

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;
}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan