6

से: http://en.wikipedia.org/wiki/X86_calling_conventionsकॉलर को सीडीईसी कॉलिंग सम्मेलन में ढेर को क्यों साफ़ करना है?

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

क्यों हम स्पष्ट रूप से ढेर स्पष्ट करने के बाद कहा जाता है समारोह ढेर इसलिए ढेर सूचक बहाल बंद मापदंडों poped है चाहिए ईएसपी के लिए 12 को जोड़ने की जरूरत है ...?

एक और सवाल:

सैद्धांतिक रूप से, यह कॉल प्राप्त करने वाला सफाई सही की देखभाल करने के साथ चर पैरामीटर कार्यों को लागू करने (उदाहरण के लिए यदि आप एक रजिस्टर में स्टैक पर तर्क की संख्या से पारित) संभव हो सकता है?

उत्तर

19

क्योंकि, सी कॉलिंग सम्मेलन के साथ, कॉल किया गया फ़ंक्शन पैरामीटर पॉप नहीं करेगा। यह इस कॉलिंग सम्मेलन का मुद्दा है।

यह परिवर्तनीय तर्कों जैसी चीजों की अनुमति देता है।

+0

बिल्कुल। सी कार्यों के साथ, कॉलर स्टैक पर कई तर्कों को धक्का दे सकता है क्योंकि इसे फ़ंक्शन कॉल करने से पहले पसंद है। बुलाया गया फ़ंक्शन बस यह नहीं जानता कि कितने साफ किए जाने चाहिए। –

+1

कैली को कैसे पता चलता है कि इसे कितने पैरामीटर कहा जाता था ताकि वह सुरक्षित रूप से उन तक पहुंच सके? Printf() के मामले में यह प्रारूप स्ट्रिंग को पार्स कर सकता है लेकिन अन्यथा यह कैसे करता है? – anon

+0

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

6

यह _cdecl हैडर

इन सम्मेलनों फोन करने वाले ढेर है, जो चर तर्क सूची के लिए अनुमति देता है, जैसे से तर्क साफ ऊपर विकिपीडिया पृष्ठ पर सही नहीं था। printf()।

संबंधित मुद्दे