Gerçekleştirilen bazı teğet tartışmalara değinmek için bir cevap daha ekleyeceğim.
C ABI (uygulama ikili arayüzü) başlangıçta, yığındaki argümanları ters sırada (yani - sağdan sola itilmiş) iletmek için çağrıldı; burada arayan da yığın deposunu serbest bırakır. Modern ABI aslında argümanları geçiş argümanları için kullanır, ancak mangling düşüncelerinin çoğu o orijinal yığın argümanına geçer.
Orijinal Pascal ABI, aksine, argümanları soldan sağa itti ve callee argümanları patlatmak zorunda kaldı. Orijinal C ABI, iki önemli noktada orijinal Pascal ABI'dan üstündür. Bağımsız değişken itme sırası, ilk bağımsız değişkenin yığın ofsetinin her zaman bilinmesi anlamına gelir ve bilinmeyen sayıda bağımsız değişkene sahip işlevlere izin verir, burada erken bağımsız değişkenler kaç tane bağımsız değişken olduğunu kontrol eder (ala printf
).
C ABI'nin daha üstün olduğu ikinci yol, arayan ve arayan kişinin kaç argüman olduğu konusunda anlaşamaması durumundaki davranıştır. C durumunda, sonuncuyu geçen argümanlara gerçekten erişmediğiniz sürece, kötü bir şey olmaz. Pascal'da, yığından yanlış sayıda bağımsız değişken açılır ve tüm yığın bozulur.
Orijinal Windows 3.1 ABI, Pascal'a dayanıyordu. Bu nedenle, Pascal ABI (soldan sağa argümanlar, callee çıkar) kullandı. Argüman numarasındaki herhangi bir uyuşmazlık, yığın bozulmasına neden olabileceğinden, bir karıştırma düzeni oluşturuldu. Her işlev adı, bağımsız değişkenlerinin boyutunu bayt cinsinden gösteren bir sayı ile karıştırılmıştır. Yani, 16 bit makinede aşağıdaki fonksiyon (C sözdizimi):
int function(int a)
İçin karıştırılmış oldu function@2
çünkü int
iki bayt genişliğinde. Bu, bildirim ve tanım uyuşmazlığı durumunda, bağlayıcının çalışma zamanında yığını bozmak yerine işlevi bulamayacağı şekilde yapılmıştır. Tersine, program bağlanırsa, çağrının sonunda yığından doğru sayıda bayt geldiğinden emin olabilirsiniz.
32 bit Windows ve sonrası için stdcall
ABI kullanın. Pascal ABI'ye benzer, ancak push sırası C'deki gibi sağdan sola. Pascal ABI gibi, mangling adı da yığının bozulmasını önlemek için argüman bayt boyutunu işlev adına karıştırır.
Burada başka bir yerde yapılan iddiaların aksine, C ABI, Visual Studio'da bile işlev adlarını değiştirmez. Tersine, stdcall
ABI spesifikasyonu ile dekore edilmiş mangling fonksiyonları VS'ye özgü değildir. GCC, Linux için derlerken bile bu ABI'yi destekler. Bu, Linux tarafından derlenen ikili dosyaların Windows derlenmiş DLL'lerine çalışma süresi bağlantısına izin vermek için kendi yükleyicisini kullanan Wine tarafından yaygın olarak kullanılır .