Menggunakan Daftar Penunjuk Asas dalam C Inline ASM
Soalan:
Saya sedang mencuba untuk menggunakan daftar penuding asas (%rbp) dalam pemasangan sebaris. Walau bagaimanapun, apabila saya mengakses pembolehubah selepas asm sebaris, kesalahan seg program. Coretan kod di bawah menggambarkan isu:
void Foo(int &x) { asm volatile ("pushq %%rbp;" "movq %%rsp, %%rbp;" "subq , %%rsp;" "movl , -12(%%rbp);" "movq %%rbp, %%rsp;" "popq %%rbp;" : : : ); x = 5; }
Diagnosis Masalah:
Kod seg rosak kerana ia menimpa nilai yang disimpan dalam "zon merah" di bawah RSP , yang GCC gunakan untuk menyimpan a nilai.
Penyelesaian:
Untuk mengelakkan isu ini, peruntukkan ruang gores untuk asm sebaris anda menggunakan operan output "=m" atau langkau secara eksplisit ke atas zon merah menggunakan arahan sub $-128, %rsp. Sebagai alternatif, elakkan menggunakan ruang calar di tempat pertama dan biarkan pengkompil memperuntukkan dan menyimpan daftar untuk anda.
Amalan Terbaik untuk ASM Sebaris:
Petua Tambahan:
Atas ialah kandungan terperinci Mengapa Pemasangan Sebaris Saya Menggunakan Daftar Penunjuk Asas (%rbp) Menyebabkan Kerosakan Seg dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!