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!