मुझे एक कोड आया void *p = &&abc;
। का क्या महत्व है&&
यहाँ ? मैं संदर्भ के संदर्भों के बारे में जानता हूं, लेकिन मुझे लगता &&
है कि इस संदर्भ में उपयोग अलग है। क्या &&
इंगित करता है void *p = &&abc;
?
मुझे एक कोड आया void *p = &&abc;
। का क्या महत्व है&&
यहाँ ? मैं संदर्भ के संदर्भों के बारे में जानता हूं, लेकिन मुझे लगता &&
है कि इस संदर्भ में उपयोग अलग है। क्या &&
इंगित करता है void *p = &&abc;
?
जवाबों:
&&
वर्तमान फ़ंक्शन में परिभाषित लेबल का पता प्राप्त करने के लिए gcc का विस्तार है।
void *p = &&abc
मानक C99 और C ++ में अवैध है।
इस ग्राम के साथ संकलित ++।
void*
।
__forceinline
? __declspec(naked)
? मेरा पसंदीदा MSVCism में से एक है: template<typename T> class X { friend T; }
जो अमान्य है C ++ 03।
यह एक लेबल का पता है और यह जीसीसी के लिए विशिष्ट है ।
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
आप इसे परीक्षण द्वारा स्वयं समझ सकते हैं:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
किस मामले में जीसीसी का कहना है:
त्रुटि: लेबल 'a' का उपयोग किया गया है लेकिन परिभाषित नहीं है
आपको वास्तव में इसे समझने के लिए कोडांतरक को जानने की आवश्यकता है, लेकिन मैं आपको यह समझाने की कोशिश करूंगा कि एक लेबल का क्या मतलब है।
OS के बाद डिस्क से .exe फ़ाइल लोड होने पर, ऑपरेटिंग सिस्टम के एक घटक को "लोडर" कहा जाता है (विंडोज़ में "PE लोडर" है, लिनक्स में "ELF लोडर" या शायद अन्य लोग भी हैं, यदि वे इसमें संकलित हैं कर्नेल), यह उस प्रोग्राम के "वर्चुअलाइजेशन" को एक प्रक्रिया में बदल देता है।
इस प्रक्रिया को लगता है कि यह रैम में एकमात्र है और इसकी पूरी रैम तक पहुंच है (यानी, 32-बिट मशीन पर 0x00000000-0xFFFFFFFF)।
(ऊपर क्या हो रहा है की एक छोटी overwiew है, आप वास्तव में यह पूरी तरह से समझने के लिए विधानसभा सीखने की जरूरत है, तो मेरे साथ सहन)
अब, स्रोत कोड में लेबल मूल रूप से एक पता है। "गोटो लेबल?" उस पते पर कूदने के अलावा और कुछ नहीं करता ( विधानसभा में निर्देश सूचक के बारे में सोचें )। यह लेबल इस RAM पते को संग्रहीत करता है, और इस तरह आप उस पते का पता लगा सकते हैं।
ASM सीख लेने के बाद, आपको पता चलेगा कि वह पता .text
निष्पादन योग्य अनुभाग के भीतर एक निर्देश को इंगित करता है । .text
खंड एक जो निष्पादित करने के लिए आप इस कार्यक्रम के (बाइनरी) कोड रखती है।
आप इसके साथ निरीक्षण कर सकते हैं:
objdump -x a.out
जैसा कि जीसीसी में वर्णित है , आप इसका उपयोग जंप टेबल को इनिशियलाइज़ करने के लिए कर सकते हैं। कुछ स्कैनर जनरेटर जैसे कि re2c ( -g
पैरामीटर देखें ) का उपयोग करें जो अधिक कॉम्पैक्ट स्कैनर उत्पन्न करता है। हो सकता है कि समान तकनीक को नियोजित करने वाला पार्सर जनरेटर भी हो ।