2009-10-08 15 views
6

: http://en.wikipedia.org/wiki/X86_calling_conventionsNeden arayan cdecl çağrı kuralı içindeki yığını temizlemek zorunda? Gönderen

push c 
push b 
push a 
call function_name 
add esp, 12 ;Stack clearing 
mov x, eax 

Neden açıkça denilen fonksiyon nedenle yığın işaretçisi geri yığın kapalı parametreleri poped olmalıydı çünkü yığın temizlemek için ESP için 12 eklemem gerekir mi ...?

başka soru: Teorik olarak

, (bir kayıtta yığın argümanların sayısını geçmesi durumunda örneğin) temizleme hakkının bakımı Aranan değişken parametre fonksiyonlarını uygulamak mümkün olurdu?

cevap

19

Çünkü C çağrı kuralı ile çağrılan işlev parametreleri pop olmaz. Bu çağrı sözleşmesinin amacı budur.

Bu değişken argüman gibi şeyler verir.

+0

Kesinlikle. C işlevleri ile, arayan bir işlevi çağırmadan önce istendiği gibi yığında birçok argüman çalıştırabilir. Aranan işlev sadece kaç tane temizlenmelidir bilmez. –

+1

nasıl Aranan bunun güvenli bir şekilde erişebilmesi için çağrıldı kaç parametreler biliyor? Printf() durumunda format dizisini ayrıştırabilir, ancak aksi halde nasıl yapar? – anon

+0

http://en.wikipedia.org/wiki/Stdarg.h –

6

Bu _cdecl başlığındaki arayan örneğin değişken argüman listeleri için izin veren yığın, gelen argümanlar temizler bu sözleşmeler ise

yukarıdaki wikipedia sayfasında sağ yoktu. Printf().

İlgili konular