जीसीसी आप (void *addr = &&label
के रूप में) एक लेबल के पते ले जा रहा है और फिर इसे (jump *addr
) करने के लिए कूद कर एक अभिकलन गोटो का उपयोग कर सकते हैं। GCC manual कहता है कि आप इस पते पर किसी भी से कूद सकते हैं जहां फ़ंक्शन में, यह केवल एक अन्य फ़ंक्शन से इसे कूदने के लिए अनिर्धारित है।जीसीसी गणना की गोटो और ढेर सूचक का मूल्य
जब आप कोड पर कूदते हैं तो यह रजिस्टरों के मूल्यों के बारे में कुछ भी नहीं मान सकता है, इसलिए संभवतः यह उन्हें स्मृति से पुनः लोड करता है। हालांकि स्टैक पॉइंटर का मूल्य भी आवश्यक रूप से परिभाषित नहीं किया गया है, उदाहरण के लिए आप एक नेस्टेड स्कोप से कूद सकते हैं जो अतिरिक्त चर घोषित करता है।
सवाल यह है कि जीसीसी सही मूल्य पर स्टैक पॉइंटर के मूल्य पर कैसे सेट करता है (यह बहुत अधिक या बहुत कम हो सकता है)? और यह (यदि ऐसा करता है) के साथ कैसे सहभागिता करता है?
अंत में, अतिरिक्त बिंदुओं के लिए, आप कहां से किसी लेबल पर जा सकते हैं के बारे में असली बाधाएं हैं? पूर्व पूर्वाह्न से अधिक के लिए, आप शायद इसे एक इंटरप्ट हैंडलर से कर सकते हैं।
+1, अच्छा स्पष्टीकरण – rkosegi
हस्तक्षेप करने वाले हैंडलरों के बारे में दिलचस्प बात यह है कि ढेर को बेकार किया जाएगा और आप सभी रजिस्टरों (एसपी सहित) को पुनर्स्थापित कर सकते हैं। इस मामले में प्रदान किया गया है कि जीसीसी जो आपने वर्णन किया है वह करता है तो आप वास्तव में एक इंटरप्ट हैंडलर से एक लेबल पर कूदने में सक्षम होंगे। एकमात्र मामला यह काम नहीं करेगा अगर जीसीसी गणना किए गए गोटो के आसपास विशेष प्रति-फ़ंक्शन स्टैक हैंडलिंग कोड डालता है। – jleahy
@jleahy: जो यह निश्चित रूप से कर सकता है (यह नहीं जानता कि यह करता है)। न्यूनतम आवश्यकता यह है कि फ़ंक्शन में एक परिभाषित "साफ" राज्य होता है: सभी लेबल जिनके पते को इस स्वच्छ राज्य में शुरू किया जाता है, और सभी गणना किए गए कूद कूदने से पहले स्वच्छ स्थिति स्थापित करते हैं। असल में यह उससे भी कम हो सकता है: "लेबल का पता" कुछ कोड का पता हो सकता है जो स्वच्छ राज्य से लेबल पर अपेक्षित राज्य तक जाता है, फिर 'असली "लेबल मिल जाता है। यह काम करेगा, लेकिन यह कुछ और विरोधाभास हो सकता है कि जीसीसी लेबल के पते के बारे में कहता है। –