2011-09-17 16 views
5

सी चीजों को कैसे पास करता है, इस तंत्र के बारे में मुझे पता है कि यह एक रजिस्टर या स्टैक के माध्यम से किया जाता है।सी में फ़ंक्शन तर्क कैसे पारित किए जाते हैं?

रजिस्टर या ढेर? बिल्कुल कैसे?

+2

तकनीकी रूप से, यह एक कार्यान्वयन विस्तार है, और इसलिए प्रत्येक सी संकलक फ़ंक्शन तर्कों को पारित करना चुन सकता है हालांकि यह चाहता है। – jwodder

उत्तर

5

दोनों। और सम्मेलन मंच द्वारा अलग-अलग होंगे।

x86 पर, मान आमतौर पर स्टैक द्वारा पारित होते हैं। X64 पर, रजिस्टर द्वारा गुजरना पसंद है।

सभी मामलों में, यदि आपके पास बहुत से पैरामीटर हैं, तो कुछ को स्टैक द्वारा पारित किया जाना होगा।

(जैसा कि कहा कुछ compilers अलग ढंग से यह काम हो जाएगा) सामान्य कार्य के लिए कहता है वे ढेर पर पारित कर रहे हैं x86 calling conventions

+2

यह भी ध्यान दिया जाना चाहिए कि किसी दिए गए आर्किटेक्चर के लिए भी सम्मेलन बुलाए जाने में मतभेद हैं। उदाहरण के लिए 'cdecl' (लिनक्स में उपयोग किया जाता है?) और' stdcall' (WinAPI?) की तुलना करें। –

+1

सहमत हुए। उस विकिपीडिया पेज के निचले हिस्से में एक चार्ट है जो अलग-अलग ओएस पर और उसी ओएस के भीतर भी विभिन्न सम्मेलनों को दिखाता है। – Mysticial

+0

@ माइस्टिकल यह एक अच्छा लिंक है - लेकिन मुझे लगता है कि उत्तर के साथ/साथ कुछ अतिरिक्त जानकारी डाली जानी चाहिए। –

3

आमतौर पर देखें। आमतौर पर यह पुश निर्देशों की एक श्रृंखला है जो डेटा को ढेर पर रखती है।

सिस्टम कॉल जैसे विशेष मामले हैं जहां पैरामीटर असेंबली निर्देशों और रजिस्टरों के माध्यम से पारित होते हैं। हार्डवेयर मामलों में वे रजिस्टरों या यहां तक ​​कि कुछ अंतराल संकेतों के माध्यम से पारित होते हैं जो परिणामस्वरूप रजिस्टरों को लिखते हैं।

रजिस्ट्रारों की उच्च संख्या वाले आर्किटेक्चर पर उन्हें आमतौर पर कुछ आरआईएससी और 64 बिट आर्किटेक्चर जैसे रजिस्टरों के माध्यम से पारित किया जाता है।

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