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!