Saya akan menambahkan satu jawaban lain, untuk membahas beberapa diskusi tangensial yang terjadi.
C ABI (application binary interface) awalnya dipanggil untuk meneruskan argumen pada stack dalam urutan terbalik (yaitu - didorong dari kanan ke kiri), di mana pemanggil juga membebaskan penyimpanan stack. ABI modern sebenarnya menggunakan register untuk meneruskan argumen, tetapi banyak pertimbangan yang merusak kembali ke argumen stack asli yang diteruskan.
Pascal ABI yang asli, sebaliknya, mendorong argumen dari kiri ke kanan, dan callee harus melontarkan argumen. ABI C asli lebih unggul dari ABI Pascal asli dalam dua poin penting. Argumen push order berarti bahwa offset tumpukan dari argumen pertama selalu diketahui, memungkinkan fungsi yang memiliki jumlah argumen yang tidak diketahui, di mana argumen awal mengontrol berapa banyak argumen lain yang ada (ala printf
).
Cara kedua di mana C ABI lebih unggul adalah perilaku jika penelepon dan penerima tidak setuju tentang berapa banyak argumen yang ada. Dalam kasus C, selama Anda tidak benar-benar mengakses argumen setelah yang terakhir, tidak ada hal buruk yang terjadi. Di Pascal, jumlah argumen yang salah muncul dari tumpukan, dan seluruh tumpukan rusak.
Windows 3.1 ABI asli didasarkan pada Pascal. Karena itu, ia menggunakan Pascal ABI (argumen dalam urutan kiri ke kanan, callee pops). Karena ketidakcocokan dalam nomor argumen dapat menyebabkan korupsi tumpukan, skema kerusakan dibentuk. Setiap nama fungsi dihancurkan dengan angka yang menunjukkan ukuran, dalam byte, dari argumennya. Jadi, pada mesin 16 bit, fungsi berikut (sintaks C):
int function(int a)
Hancur function@2
, karena int
lebarnya dua byte. Hal ini dilakukan agar jika deklarasi dan definisi tidak cocok, linker akan gagal menemukan fungsi daripada merusak tumpukan pada waktu proses. Sebaliknya, jika program menautkan, maka Anda bisa yakin jumlah byte yang benar dikeluarkan dari tumpukan di akhir panggilan.
32 bit Windows dan selanjutnya gunakan stdcall
ABI sebagai gantinya. Mirip dengan Pascal ABI, hanya saja urutan push seperti di C, dari kanan ke kiri. Seperti Pascal ABI, nama mangling mengubah ukuran byte argumen menjadi nama fungsi untuk menghindari korupsi tumpukan.
Tidak seperti klaim yang dibuat di tempat lain di sini, C ABI tidak merusak nama fungsi, bahkan di Visual Studio. Sebaliknya, fungsi mangling yang didekorasi dengan stdcall
spesifikasi ABI tidak unik untuk VS. GCC juga mendukung ABI ini, bahkan saat mengompilasi untuk Linux. Ini digunakan secara luas oleh Wine , yang menggunakan loadernya sendiri untuk memungkinkan penautan waktu proses dari binari terkompilasi Linux ke DLL yang dikompilasi Windows.