2012-02-13 9 views
23

मुझे कॉलर और कैली सहेजे गए रजिस्टरों और किस का उपयोग करने के बीच अंतर को समझने में कुछ परेशानी हो रही है।कैली और कॉलर सहेजे गए रजिस्टरों क्या हैं?

मैं MSP430 उपयोग कर रहा हूँ:

प्रक्रिया:

mov.w #0,R7 
mov.w #0,R6 
add.w R6,R7 
inc.w R6 
cmp.w R12,R6 
jl l$loop 
mov.w R7,R12 
ret 

ऊपर कोड एक कॉल प्राप्त करने वाला है और इसलिए यह सम्मेलन इस प्रकार एक पाठ्यपुस्तक उदाहरण में इस्तेमाल किया गया था। आर 6 और आर 7 कैली बचाए गए हैं और आर 12 कॉलर बचाया गया है। मेरी समझ यह है कि कैली सेव किए गए regs इस अर्थ में "वैश्विक" नहीं हैं कि प्रक्रिया में अपना मूल्य बदलना प्रक्रिया के बाहर इसके मूल्य को प्रभावित नहीं करेगा। यही कारण है कि आपको शुरुआत में कैली रे में एक नया मूल्य बचाना होगा।

आर 12, बेहतर शब्दों की कमी के लिए सहेजा गया कॉलर "वैश्विक" है। कॉल के बाद आर 12 पर प्रक्रिया का स्थायी प्रभाव क्या है।

क्या मेरी समझ सही है? क्या मुझे अन्य चीजें याद आ रही हैं?

उत्तर

52

कोलर-बचाया रजिस्टरों (उर्फ अस्थिर रजिस्टरों) अस्थायी मात्रा की जरूरत है कि कॉल भर में संरक्षित नहीं किया जा धारण करने के लिए उपयोग किया जाता है।

इसी कारण से, इन रजिस्टरों को स्टैक पर धक्का देना कॉलर की ज़िम्मेदारी है यदि वह प्रक्रिया कॉल के बाद इस मान को पुनर्स्थापित करना चाहता है।

कॉल प्राप्त करने वाला: सहेजे गए रजिस्टरों (उर्फ नॉन-वोलाटाइल रजिस्टरों) लंबे समय तक रहा मानों कॉल भर में संरक्षित किया जाना चाहिए धारण करने के लिए उपयोग किया जाता है।

फोन करने वाले एक प्रक्रिया कॉल करता है, यह उम्मीद कर सकते हैं कि उन रजिस्टरों कॉल प्राप्त करने वाला रिटर्न के बाद एक ही मूल्य का आयोजन करेगा, यह कॉल प्राप्त करने वाला की जिम्मेदारी उन्हें बचाने और उन्हें फोन करने वाले पर लौटने से पहले बहाल करने के लिए बना रही है।

उम्मीद है कि यह मदद करता है।

+2

एक और शब्द जिसे मैं उपयोग करना चाहता हूं वह "कॉल-क्लॉब्बेड" बनाम "कॉल-संरक्षित" है। कॉलर बनाम कैली केवल एक अक्षर से भिन्न होता है, और कंपाइलर्स वास्तव में कॉल में कॉल-क्लॉबर्ड रेग को सहेजते/पुनर्स्थापित नहीं करते हैं (वे केवल कॉल-संरक्षित regs में मान डालते हैं।) अस्थिर बनाम गैर-अस्थिरता सी के ' अस्थिर 'कीवर्ड। इसलिए "कॉल-क्लॉब्बेड" सटीक रूप से वर्णन करता है कि कॉलिंग कन्वेंशन/एबीआई को कैसे कार्यान्वित किया जा सकता है, इसके बजाए * फ़ंक्शन * अन्य * कार्यों के बारे में क्या कार्य करने की आवश्यकता है। –

8

कैली बनाम कॉलर सहेजा गया एक सम्मेलन है जो एक कॉल में एक रजिस्टर में मूल्य को बचाने और बहाल करने के लिए जिम्मेदार है। सभी पंजीयक "वैश्विक" हैं कि किसी भी कोड को कहीं भी एक रजिस्टर (या संशोधित) देख सकता है और उन संशोधनों को किसी भी बाद के कोड द्वारा कहीं भी देखा जाएगा। रजिस्टर बचत सम्मेलनों का बिंदु यह है कि कोड कुछ रजिस्टरों को संशोधित नहीं करना चाहिए, क्योंकि अन्य कोड मानते हैं कि मान संशोधित नहीं है।

आपके उदाहरण कोड में, रजिस्टरों में से कोई भी कैली सहेजता है, क्योंकि यह रजिस्टर मानों को सहेजने या पुनर्स्थापित करने का कोई प्रयास नहीं करता है। हालांकि, यह एक पूरी प्रक्रिया नहीं प्रतीत होता है, क्योंकि इसमें एक अपरिभाषित लेबल (l$loop) में एक शाखा है। तो यह एक प्रक्रिया के बीच से कोड का एक टुकड़ा हो सकता है जो कुछ रजिस्टरों को कैली बचाने के रूप में मानता है; आप बस सहेजने/पुनर्स्थापित निर्देशों को याद कर रहे हैं।

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