Rumah > pembangunan bahagian belakang > C++ > Mengapa Pemasangan Sebaris Saya Menggunakan Daftar Penunjuk Asas (%rbp) Menyebabkan Kerosakan Seg dalam C ?

Mengapa Pemasangan Sebaris Saya Menggunakan Daftar Penunjuk Asas (%rbp) Menyebabkan Kerosakan Seg dalam C ?

Patricia Arquette
Lepaskan: 2024-12-28 02:17:10
asal
619 orang telah melayarinya

Why Does My Inline Assembly Using the Base Pointer Register (%rbp) Cause a Seg Fault in C  ?

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

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:

  • Kekalkan sebaris ASM sesingkat mungkin, sebaik-baiknya hanya termasuk arahan yang tidak boleh dilakukan oleh pengkompil jana.
  • Gunakan kekangan input/output untuk menentukan aliran data antara kod ASM dan C.
  • Elakkan menggunakan ASM sebaris untuk blok kod besar. Pertimbangkan untuk menulis fungsi pemasangan.

Petua Tambahan:

  • Apabila menggunakan ASM sebaris, ketahui kawasan "zon merah" di bawah tindanan penunjuk.
  • Kekangan input boleh digunakan untuk menentukan daftar untuk input, mengurangkan keperluan untuk peruntukan daftar eksplisit.
  • Isytiharkan "cc" (kod syarat) clobber jika kod anda mengubah suai bendera.

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!

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