2010-09-15 15 views
5

इसइस तरह के कथन में लिखे गए अक्षर कहाँ हैं (var == 'x')?

char var; 

if(var == 'x'); 

जैसे बयान में कहें क्या हम पहले स्थान पर 'x' के लिए कोई स्मृति आवंटित करते हैं?

यदि हां, यह कौन सा है (ढेर/डेटा)?

धन्यवाद!

+3

क्या आपका मतलब 'बी' के बजाय 'x' था? –

+0

हाँ जॉन, उस टाइपो के लिए खेद है :-) – KedarX

उत्तर

24

मूल्य 'x' को तुलना निर्देश के भाग के रूप में सीधे कोड सेगमेंट में संग्रहीत किया जा सकता है, या इसे एक रजिस्टर में तत्काल लोड के लिए कोड सेगमेंट में संग्रहीत किया जा सकता है, या अप्रत्यक्ष लोड के लिए डेटा सेगमेंट में या तुलना करें। यह कंपाइलर पर निर्भर है।

+3

यह देखते हुए कि आपने इतनी अच्छी गणना की है, मैं दूसरे में चिपकूँगा: रजिस्टर्स। 'एक्स' के ASCII मान को कुछ पहले निष्पादित कोड के परिणामस्वरूप आसानी से एक रजिस्टर में आसानी से पंजीकृत करने के लिए (कंपाइलर द्वारा) ज्ञात किया जा सकता है, या इस तरह के पूर्व-मौजूदा राज्य की वृद्धि, xor आदि द्वारा उत्पन्न किया जा सकता है। –

7

लगभग हर संकलक एक सक्षम वास्तुकला लक्ष्य (16-बिट और ऊपर) निरंतर 'एक्स' के लिए CPU अनुदेश में तुलना के लिए रखा जाएगा:

cmp r0, #'x' 

कम सक्षम आर्किटेक्चर में इस तरह के स्थिरांक डाल करने के लिए करते हैं कॉन्स मेमोरी में एक टेबल और या तो इसे तुलना के लिए लोड करें, या सीधे स्मृति से तुलना करें।

4

जीसीसी की एक स्थापित प्रति द्वारा लक्षित किसी भी वास्तुकला के लिए इस तरह के कुछ सवालों के जवाब देने की तकनीक यहां दी गई है। उपयुक्त कोड खंड के लिए असेंबली स्रोत फ़ाइल प्राप्त करने के लिए -S ध्वज का उपयोग करें। वैकल्पिक रूप से, असेंबलर द्वारा उत्पन्न वास्तविक बाइट्स दिखाने वाली असेंबली सूची प्राप्त करने के लिए -Wa,-al का उपयोग करें। उदाहरण के लिए,

int foo(char var) { 
    if (var == 'x') 
     return 42; 
    return 17; 
} 

मेरे Windows पीसी पर gcc -c -Wa,-al साथ संकलित

 
GAS LISTING C:\DOCUME~1\Ross\LOCALS~1\Temp/ccyDNLLe.s     page 1 


    1       .file "q3715034.c" 
    2       .text 
    3       .p2align 4,,15 
    4     .globl _foo 
    5       .def _foo; .scl 2;  .type 32; 
.endef 
    6     _foo: 
    7 0000 55     pushl %ebp 
    8 0001 31C0     xorl %eax, %eax 
    9 0003 89E5     movl %esp, %ebp 
    10 0005 807D0878    cmpb $120, 8(%ebp) 
    11 0009 5D     popl %ebp 
    12 000a 0F94C0    sete %al 
    13 000d 48     decl %eax 
    14 000e 83E0E7    andl $-25, %eax 
    15 0011 83C02A    addl $42, %eax 
    16 0014 C3909090    ret 
    16  90909090 
    16  90909090 

लाइनों 7 और 9 उत्पादन करने के लिए सभी कि समारोह प्रविष्टि बॉयलर प्लेट के बने हुए हैं, और लाइनों 11 और 16 समारोह कर रहे हैं बॉयलर प्लेट से बाहर निकलें। लाइन 8 पूरे रिटर्न वैल्यू रजिस्टर को 0 पर साफ़ करता है। लाइन 10 वास्तविक तुलना var == 'x' है और आप cmpb $120, 8(%ebp) निर्देश में जादू संख्या $120 देख सकते हैं; 'x' के लिए ASCII कोड हेक्स में 120 दशमलव या 0x78 है। आप ऑफसेट 8 पर .text सेगमेंट में 0x78 देख सकते हैं जहां इसे सीएमपीबी निर्देश के हिस्से के रूप में संग्रहीत किया जाता है। शेष शरीर मेरे नमूना टुकड़े से वापसी मूल्यों की पसंद को लागू करता है, AL बनाने के लिए एसईटीई निर्देश का लाभ लेते हुए 1 तुलनात्मक होने पर तुलनात्मक रूप से, या 0 अन्यथा हो। शेष निर्देश DECL, ANDL, और ADDL फिर AL के प्रारंभिक मूल्य के आधार पर 17 या 42 उत्पन्न करते हैं, जो पूरे EAX रजिस्टर में पंजीकृत होते हैं, जहां इस आर्किटेक्चर में पूर्णांक कार्यों से वापसी मान संग्रहीत किए जाते हैं।

+0

+1 ... महान स्पष्टीकरण। धन्यवाद! – KedarX

+0

+1 मैं केदार से सहमत हूं। – JeremyP

1

एंथनी ने चीजों के व्यावहारिक पक्ष का उत्तर दिया। मुझे एक और भाषा सैद्धांतिक बिंदु से सवाल पर टिप्पणी करने दें। सी ++ मानक रैवल्यू एक्सप्रेशन स्ट्रिंग अक्षर के अपवाद के साथ लैवल्यू एक्सप्रेशन एरे का जिक्र करते हुए शाब्दिक परिभाषित करता है। सी ++ मानक में एक स्पष्ट अवधारणा है कि ऑब्जेक्ट क्या है। असल में, ऑब्जेक्टऑब्जेक्ट प्रकार (int, double, MyClass, ...) का कुछ है जिसमें पता है। लेकिन रावलस्केलर प्रकार जैसे char या double वस्तुओं को नहीं माना जाता है।वे केवल मूल्य हैं और स्मृति स्थान का संदर्भ नहीं देते हैं। इसमें 'x' और 3.14 जैसे शाब्दिक शामिल हैं।

कैसे और कहाँ एक कंपाइलर इन मानों को संग्रहीत करता है मानक के दायरे से बाहर है। इसे सीधे उन्हें स्टोर भी नहीं करना है। उदाहरण के लिए, x * 8 जैसी अभिव्यक्ति का अनुवाद असेंबली कोड में किया जा सकता है जो x तीन बिट्स के बाईं ओर बाईं ओर जाता है।

+0

प्रश्न इस बात पर ध्यान केंद्रित करता है कि गतिशील स्मृति आवंटन शामिल हो सकता है, या शायद डेटा स्थान में स्थिर स्मृति भी हो सकती है। ऐसा लगता है कि ओपी मानकों या भाषा विनिर्देशों के बारे में चिंतित नहीं है। – wallyk

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