2012-03-20 104 views
7

ईएक्स का उपयोग 32 बिट प्लेटफॉर्म में फ़ंक्शन के रिटर्न वैल्यू को स्टोर करने के लिए किया जाता है, मुझे आश्चर्य है कि फ़ंक्शन के रिटर्न वैल्यू का आकार 4 बाइट्स से बड़ा है, ईएक्स इसे कैसे संभालता है? इस मामले में ओएस स्टैक पर रिटर्न वैल्यू को सेव कर सकता है और ईएक्स में स्टैक के पते को स्टोर कर सकता है, लेकिन फिर ओएस कैसे बता सकता है कि ईएक्स में संग्रहीत मूल्य रिटर्न वैल्यू का पता है या वास्तव में रिटर्न वैल्यू है?ईएक्स स्टोर वापसी मूल्य कैसे आकार का आकार 4 बाइट से बड़ा हो सकता है?

+0

इस प्रश्न का उत्तर देखें: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large- संरचनाएं –

उत्तर

12

कॉलर और कैली को रजिस्ट्रार और स्टैक के बारे में सहमत होना चाहिए। इसे calling convention कहा जाता है, जो application binary interface (ABI) नामक एक बड़ी अवधारणा का हिस्सा है। कैली परिभाषित करता है कि यह कैसे कहना चाहता है (यानी क्या तर्क स्टैक्स पर, रजिस्टरों आदि में होने की आवश्यकता है) और संकलक यह सुनिश्चित करता है कि जो कोड उत्पन्न करता है वह कॉलिंग सम्मेलन का अनुपालन करता है।

आपके विशिष्ट प्रश्न के लिए, यह एबीआई पर निर्भर करता है। कभी-कभी यदि वापसी मान 4 बाइट से बड़ा है लेकिन 8 बाइट से बड़ा नहीं है, तो इसे ईएक्स और ईडीएक्स में विभाजित किया जा सकता है। लेकिन ज्यादातर समय कॉलिंग फ़ंक्शन कुछ मेमोरी (आमतौर पर ढेर पर) आवंटित करेगा और इस क्षेत्र में कॉलर को कॉल करने के लिए एक पॉइंटर पास करेगा।

ध्यान दें कि ओएस की भूमिका उतनी महत्वपूर्ण नहीं है जितनी आप सोचते हैं। विभिन्न कॉलिंग सम्मेलनों वाले द्विआधारी एक ही सिस्टम पर सह-अस्तित्व में हो सकते हैं, और द्विआधारी आंतरिक रूप से विभिन्न कॉलिंग सम्मेलनों का भी उपयोग कर सकते हैं। ओएस का एबीआई केवल तभी महत्वपूर्ण होता है जब बाइनरी सिस्टम सिस्टम पुस्तकालयों को कॉल करे।

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

  • कोई संबंधित समस्या नहीं^_^