के माध्यम से कौन से रजिस्टरों को संरक्षित किया जाता है, मुझे विश्वास है कि मैं समझता हूं कि लिनक्स x86-64 एबीआई रजिस्ट्रार का उपयोग करता है और फ़ंक्शन पर पैरामीटर पास करने के लिए स्टैक करता है (सीएफ previous ABI discussion)। मैं इस बारे में उलझन में हूं कि फ़ंक्शन कॉल में कौन से रजिस्टरों को संरक्षित किया जाना अपेक्षित है। यही है, किस रजिस्ट्रार को गठबंधन नहीं किया जाता है?लिनक्स x86-64 फ़ंक्शन कॉल
उत्तर
यहाँ रजिस्टरों की पूरी तालिका है और प्रलेखन [PDF Link] से उनके उपयोग:
r12
, r13
, r14
, r15
, rbx
, rsp
, rbp
कॉल प्राप्त करने वाला: सहेजे गए रजिस्टरों हैं - वे "फ़ंक्शन कॉल संरक्षित" कॉलम में "हां" है।
एबीआई निर्दिष्ट करता है कि मानक-अनुरूप सॉफ्टवेयर के एक टुकड़े की अपेक्षा करने की अनुमति है। यह मुख्य रूप से कंपाइलर्स, लिंकर्स और अन्य भाषा प्रसंस्करण सॉफ्टवेयर के लेखकों के लिए लिखा जाता है। ये लेखक चाहते हैं कि उनके कंपाइलर कोड का उत्पादन करें जो उसी कोड (या एक अलग) कंपाइलर द्वारा संकलित कोड के साथ ठीक से काम करेगा। उन्हें सभी नियमों के एक समूह से सहमत होना है: कॉलर से कैली तक पारित कार्यों के औपचारिक तर्क कैसे हैं, कैलिली से कॉलर से फ़ंक्शन रिटर्न मूल्य वापस कैसे पास किए जाते हैं, जो रजिस्ट्रार कॉल सीमा पर संरक्षित/स्क्रैच/अपरिभाषित होते हैं, और इसलिए पर।
उदाहरण के लिए, एक नियम बताता है कि किसी फ़ंक्शन के लिए जेनरेट किए गए असेंबली कोड को मूल्य बदलने से पहले संरक्षित रजिस्टर के मान को सहेजना चाहिए, और कोड को अपने कॉलर पर लौटने से पहले सहेजे गए मान को पुनर्स्थापित करना होगा। स्क्रैच रजिस्टर के लिए, पंजीकृत मूल्य को सहेजने और पुनर्स्थापित करने के लिए जेनरेट कोड की आवश्यकता नहीं है; अगर ऐसा हो तो ऐसा कर सकता है, लेकिन मानक-अनुरूप सॉफ्टवेयर को इस व्यवहार पर निर्भर रहने की अनुमति नहीं है (यदि यह मानक-अनुरूप सॉफ्टवेयर नहीं है)।
यदि आप असेंबली कोड लिख रहे हैं, आप इन नियमों (आप संकलक की भूमिका निभा रहे हैं) द्वारा खेलने के लिए ज़िम्मेदार हैं। यही है, यदि आपका कोड कैली-संरक्षित रजिस्टर बदलता है, तो आप मूल रजिस्टर मान को सहेजने और पुनर्स्थापित करने वाले निर्देशों को सम्मिलित करने के लिए ज़िम्मेदार हैं। यदि आपका असेंबली कोड बाहरी फ़ंक्शन को कॉल करता है, तो आपके कोड को मानक-अनुरूप तरीके से तर्क पारित करना होगा, और यह इस तथ्य पर निर्भर हो सकता है कि, जब कैली रिटर्न देता है, संरक्षित रजिस्टर मूल्य वास्तव में संरक्षित होते हैं।
नियम परिभाषित करते हैं कि मानक-अनुरूप सॉफ्टवेयर कैसे मिल सकता है। हालांकि, यह कोड इन नियमों द्वारा खेलना (या उत्पन्न) कोड लिखना पूरी तरह से कानूनी है! कंपाइलर हर समय ऐसा करते हैं, क्योंकि वे जानते हैं कि कुछ परिस्थितियों में नियमों का पालन करने की आवश्यकता नहीं है।
static foo(int x);
संकलन समय में, संकलक 100% निश्चित है कि इस समारोह केवल फ़ाइल में अन्य कोड से कहा जा सकता है:
इस प्रकार है उदाहरण के लिए, एक सी समारोह नामित foo कि घोषित किया जाता है पर विचार (एस) यह वर्तमान में संकलन कर रहा है। फंक्शन foo
किसी और चीज द्वारा कभी भी नहीं कहा जा सकता है, इसकी परिभाषा दी गई है कि इसका मतलब स्थिर होना है। चूंकि संकलक संकलन समय पर foo
के सभी कॉलर्स को जानता है, इसलिए संकलक जो भी कॉलिंग अनुक्रम चाहता है उसका उपयोग करने के लिए स्वतंत्र है (foo
के कॉलर में foo
के कोड को रेखांकित करने के लिए,
असेंबली कोड के लेखक के रूप में, आप यह भी कर सकते हैं।यही है, आप दो या दो से अधिक दिनचर्या के बीच एक "निजी समझौता" लागू कर सकते हैं, जब तक कि यह समझौता मानक-अनुरूप सॉफ्टवेयर की अपेक्षाओं में हस्तक्षेप नहीं करता है या उल्लंघन नहीं करता है।
- 1. फ़ंक्शन कॉल पदानुक्रम
- 2. फ़ंक्शन कॉल से फ़ंक्शन कॉल नाम निकालने
- 3. सॉकेट() फ़ंक्शन कॉल
- 4. फ़ंक्शन कॉल
- 5. फ़ंक्शन कॉल
- 6. लिनक्स में अपने बंद() फ़ंक्शन
- 7. लिनक्स कर्नेल सिस्टम कॉल नंबर
- 8. सी ++ आभासी फ़ंक्शन कॉल बनाम बूस्ट :: फ़ंक्शन कॉल speedwise
- 9. जावास्क्रिप्ट अज्ञात फ़ंक्शन कॉल
- 10. त्रुटि फ़ंक्शन कॉल,
- 11. समानांतर फ़ंक्शन कॉल Node.js
- 12. डीएलएल से कॉल फ़ंक्शन?
- 13. सी चेतावनी फ़ंक्शन कॉल में लापता सेंटीनेल
- 14. लिनक्स कर्नेल में फ़ंक्शन कॉलर
- 15. रिकर्सिव फ़ंक्शन: कॉल php फ़ंक्शन स्वयं
- 16. लिनक्स
- 17. साझा लाइब्रेरी से फ़ंक्शन कैसे कॉल करें?
- 18. ओपनसीवी वीएलएफट स्लिम फ़ंक्शन कॉल
- 19. सामान्य फ़ंक्शन कॉल और पीसी
- 20. फ़ंक्शन कॉल से अनुक्रम बिंदु?
- 21. डीएलएल फ़ंक्शन कॉल का ओवरहेड
- 22. जावास्क्रिप्ट विंडो.ऑनर कॉल पैरेंट फ़ंक्शन
- 23. किसी ऑब्जेक्ट से कॉल फ़ंक्शन?
- 24. पायथन सीटीपीएस और फ़ंक्शन कॉल
- 25. जावा से कॉल सी फ़ंक्शन
- 26. @ फ़ंक्शन कॉल से पहले वर्ण
- 27. टेम्पलेट फ़ंक्शन कॉल अस्पष्टता त्रुटि
- 28. कोणीय: दृश्य से कॉल फ़ंक्शन
- 29. x86_64 असेंबली लिनक्स सिस्टम कॉल भ्रम
- 30. क्या() लिनक्स पर fsync() कॉल करें?
उपरोक्त। बहुत धन्यवाद! – boneheadgeek
झंडे के बारे में क्या? डीएफ की तरह? – socketpair
@socketpair: किसी भी कॉल या वापसी से पहले डीएफ को अनसेट होना चाहिए, इसलिए गिनती-ऊपर के व्यवहार को 'cld' के बिना माना जा सकता है। हालत झंडे (जेडएफ की तरह) कॉल-क्लॉब्बेड हैं। मैं वास्तव में भूल जाता हूं कि एबीआई दस्तावेज़ एफपी राउंडिंग मोड और denormals के बारे में क्या कहते हैं-शून्य हैं। हो सकता है कि कोई फ़ंक्शन उन्हें संशोधित करता है, तो उसे लौटने से पहले पिछले राज्य को सहेजना/पुनर्स्थापित करना होगा, लेकिन ** एफपी भाग ** के लिए मेरा शब्द न लें। –