Rumah >pembangunan bahagian belakang >C++ >Mengapa Kod Perhimpunan Ini Termasuk `push rax` Permulaan Sebelum Panggilan Fungsi?

Mengapa Kod Perhimpunan Ini Termasuk `push rax` Permulaan Sebelum Panggilan Fungsi?

DDD
DDDasal
2024-12-15 18:55:10191semak imbas

Why Does This Assembly Code Include an Initial `push rax` Before a Function Call?

Mengapakah RAX Push awal dalam Function Call Assembly ini?

Dalam output pemasangan coretan kod C yang disediakan, fungsi f mempamerkan tolakan awal daftar RAX ke tindanan.

Rasional

ABI x64 memberi mandat bahawa penjajaran tindanan adalah 16 bait sebelum arahan panggilan. Memandangkan panggilan menolak alamat pemulangan 8-bait ke dalam tindanan, mengganggu penjajaran, pengkompil memasukkan operasi tolak untuk mengekalkan penjajaran.

Pilihan khusus untuk menolak nilai dummy ini dioptimumkan untuk pemproses yang dilengkapi dengan enjin tindanan. , yang boleh melaksanakan arahan tolak dengan lebih cekap berbanding sub rsp, 8.

Sebaliknya, fungsi g, yang melakukan panggilan fungsi mudah tanpa pembungkus fungsi std::, tidak memerlukan pelarasan penjajaran tindanan dan dengan itu tidak melaksanakan tolakan awal ini.

Atas ialah kandungan terperinci Mengapa Kod Perhimpunan Ini Termasuk `push rax` Permulaan Sebelum Panggilan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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