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
595 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!

sumber:php.cn
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