2016-04-22 8 views
5

उदाहरण के लिए:कॉन्स्ट डेटा कहां संग्रहीत किया जाता है?

फ़ाइल demo.c में,

#inlcude<stdio.h> 
int a = 5; 
int main(){ 
    int b=5; 
    int c=a; 
    printf("%d", b+c); 
    return 0; 
} 

int a = 5 के लिए, संकलक इस आभासी स्मृति पते पर दुकान 0x5 की तरह कुछ में तो यह है कि स्थिरांक क्षेत्र में अनुवाद कर करता है, उदाहरण के लिए, Ox0000000fint c = a के लिए, इसका अनुवाद movl 0x0000000f %eax जैसा है?

फिर int b = 5 के लिए, संख्या 5 को कॉन्स्ट एरिया में नहीं रखा गया है, लेकिन सीधे mov $0x5 %ebx जैसे विधानसभा निर्देश में तत्काल अनुवाद किया गया है।

+5

चूंकि आपके प्रोग्राम में कोई अवलोकन प्रभाव नहीं है, इसलिए संकलक पूरी तरह से कुछ भी स्टोर करने के लिए स्वतंत्र नहीं है। ([उदाहरण] (https://godbolt.org/g/5DAwmj)) –

+1

अपने प्रश्न की विशिष्टताओं को छोड़कर, कॉन्स डेटा सामान्य रूप से अपने स्वयं के खंड में संग्रहीत होता है उदा। ".rodata" (केवल पढ़ने के लिए ro)। 'Int' जैसे पीओडी प्रकारों के लिए, स्मृति मान सीधे निष्पादन योग्य फ़ाइल के उस खंड पर लिखे जाते हैं, जिसे ओएस इसे शुरू करते समय स्मृति में लोड करता है। इस तरह के मामले में स्मृति को शुरू करने के लिए कोई निर्देश आवश्यक नहीं है - यह इस तरह के सही मूल्य से शुरू होता है! ग्लोबल (गैर-कॉन्स) डेटा आमतौर पर अपने स्वयं के खंड में भी दिखाई देता है, उदा। '.डेटा' या '.bss' (.bss को ओएस द्वारा प्रोग्राम स्टार्टअप पर शून्य से प्रारंभ किया गया है)। – Cameron

+2

विवरण आपके प्लेटफ़ॉर्म पर बहुत अधिक निर्भर करते हैं। कुछ आईएसए निर्देशों में तत्काल मूल्यों की अनुमति देते हैं, इसलिए मूल्य कुछ निर्देशों का हिस्सा हो सकते हैं; अन्य मूल्य केवल प्रोग्राम छवि का हिस्सा हो सकते हैं और पते द्वारा संदर्भित किए जाते हैं। अन्य मान अभी तक (शून्य की तरह) को किसी भी स्टोरेज की आवश्यकता नहीं हो सकती है और इसके बजाय विशेष लोडिंग यांत्रिकी के माध्यम से प्रदान की जाती है। –

उत्तर

1

यह निर्भर करता है।

int a = 5; 

यह एक "स्थिर" प्रारंभ (जो जब कार्यक्रम पाठ और डेटा चल रहा से पहले भरी हुई है तब होता है) है: अपने कार्यक्रम में कई स्थिरांक है। मान a द्वारा आरक्षित स्मृति में संग्रहीत है जो एक पठन-लेखन डेटा "प्रोग्राम खंड" में है। अगर कुछ a बदलता है, तो मान 5 खो जाता है।

int b=5; 

यह सीमित दायरे (केवल main() द्वारा) के साथ एक स्थानीय चर रहा है। भंडारण एक सीपीयू रजिस्टर या ढेर पर एक स्थान हो सकता है। सबसे आर्किटेक्चर के लिए उत्पन्न निर्देश, "तत्काल डेटा" के रूप में एक निर्देश में मूल्य 5 स्थापित करेंगे एक x86 उदाहरण के लिए:

mov eax, 5 

निर्देश के लिए क्षमता मनमाना स्थिरांक धारण करने के लिए सीमित है। छोटे स्थिरांक अधिकांश CPU निर्देशों द्वारा समर्थित हैं। "बड़े" स्थिरांक आमतौर पर सीधे समर्थित नहीं होते हैं। उस स्थिति में संकलक निरंतर स्मृति में संग्रहीत करेगा और इसके बजाय इसे लोड करेगा। उदाहरण के लिए,

 .psect rodata 
k1  dd  3141592653 
     .psect code 
     mov  eax k1 

एआरएम परिवार सबसे स्थिरांक सीधे लोड करने के लिए एक शक्तिशाली डिजाइन किया गया है: किसी भी 8 बिट निरंतर मूल्य किसी भी भी समय की संख्या घुमाया जा सकता है। this पृष्ठ 2-25 देखें।

एक नहीं के रूप में स्पष्ट है, लेकिन पूरी तरह से अलग आइटम बयान में है:

printf("%d", b+c); 

स्ट्रिंग %d आधुनिक सी अर्थ विज्ञान, तीन char की एक निरंतर सरणी से, है। अधिकांश आधुनिक कार्यान्वयन इसे रीड-ओनली मेमोरी में संग्रहीत करेंगे ताकि इसे बदलने का प्रयास एक सेगफाल्ट का कारण बन सके, जो निम्न स्तर की सीपीयू त्रुटि है जो आम तौर पर प्रोग्राम को निरस्त करने का कारण बनता है।

 .psect rodata 
s1  db  '%', 'd', 0 
     .psect code 
     mov  eax s1 
     push eax 
+0

जो एक पठन-लिखने वाले डेटा "प्रोग्राम सेक्शन" में है, इसलिए यह .डेटा अनुभाग में है? –

+0

@ गैब: मैंने 1 9 80 के इंटेल असेंबलर से अर्थशास्त्र का उपयोग किया था। 'data' नामक कुछ भी नहीं था। इसके बजाय वहां 'रोडटाटा', 'रवादाता' और 'स्टैक' नामक छद्म थे। उनको 'डेटा' नामक "सेगमेंट" में बांटा जाएगा। – wallyk

+0

मेरे उदाहरण में, 'बी = 5;' के लिए, हम कह सकते हैं कि "डेटा" 5 निर्देश में सीधे तत्काल संख्या के रूप में संग्रहीत किया जाता है, है ना? तो कोड खंड में यह "5" प्रकट होता है? –

1

ओपी के कार्यक्रम में, a एक "प्रारंभ" "वैश्विक है।" मुझे उम्मीद है कि यह डेटा सेगमेंट के शुरुआती हिस्से में रखा गया है। https://en.wikipedia.org/wiki/File:Program_memory_layout.pdf, http://www.cs.uleth.ca/~holzmann/C/system/memorylayout.gif देखें (more info on Memory layout of an executable program (process) से)। a का स्थान संकलक-लिंकर जोड़ी द्वारा तय किया जाता है।

दूसरी तरफ, स्वचालित (ढेर) चर, b और c स्टैक सेगमेंट में अपेक्षित हैं।

ऐसा कहा जा रहा है कि, जब तक देखा गया व्यवहार उल्लंघन नहीं किया जाता है तब तक संकलक/लिंकर को कोई अनुकूलन करने की स्वतंत्रता होती है (What exactly is the "as-if" rule?)। उदाहरण के लिए, यदि a का संदर्भ कभी नहीं दिया जाता है, तो इसे पूरी तरह से अनुकूलित किया जा सकता है।

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