2012-08-29 44 views
17

मुझे लगता है मैं तो मैं मैं प्रत्येक पंक्ति क्या करता है सही है अगर पूछ रहा हूँ से पहले विधानसभा क्रमादेशित कभी नहीं किया है सी #क्या मैं इस एमएसआईएल कोड को सही ढंग से समझता हूं?

// test.Program 
private static void Main() 
{ 
    int x = 5; 
    int y = 100; 
    Console.WriteLine(y + ", " + x); 
} 

में निम्न कोड है और मैं आईएल कोड पढ़ रहा हूँ,।

.method private hidebysig static 
    void Main() cil managed 
{ 
    // Method begins at RVA 0x2058 
    // Code size 33 (0x21) 
    .maxstack 3 // maximum stack in this method is 3 
    .entrypoint // method is initial entry point 
    .locals init (// reserves memory for x and y variables 
     [0] int32 x, // x variable is reserved on position 0 of the stack 
     [1] int32 y // y variable is reserved on position 1 of the stack 
    ) 
    IL_0000: ldc.i4.5  // integer of 4 bytes in size and the value of 5 is loaded onto the evaluation stack position 0 
    IL_0001: stloc.0  // put evaluation stack position 0 into the stack position 0, the evaluation stack is emptied 
    IL_0002: ldc.i4.s 100 // integer of 4 bytes in size and the value of 100 is loaded onto the evaluation stack position 0 
    IL_0004: stloc.1  // put evaluation stack position 0 onto the stack position 1, the evaluation stack is emptied 
    IL_0005: ldloc.1  // load stack position 1 into the evaluation stack position 0 
    IL_0006: box [mscorlib]System.Int32 // box last valuetype placed on evaluation stack, replace valuetype with reference on evaluation stack position 0, do not empty stack 
    IL_000b: ldstr ", " // put reference to string on evaluation stack position 1 
    IL_0010: ldloc.0  // load stack position 0 into the evaluation stack position 2 
    IL_0011: box [mscorlib]System.Int32 // box last valuetype placed on evaluation stack, replace valuetype with reference on evaluation stack position 0, do not empty stack 
    IL_0016: call string [mscorlib]System.String::Concat(object, object, object) // call Concat, pass values on evaluation stack, empty evaluation stack, put result of concat on evaluationstack 
    IL_001b: call void [mscorlib]System.Console::WriteLine(string) // pass first value in evaluation stack 
    IL_0020: ret   // return 
} // end of method Program::Main 

क्या मैं इस कार्यक्रम को सही ढंग से समझता हूं?

उत्तर

11

बहुत अधिक; केवल एक चीज जिसे मैं स्पष्ट करता हूं वह यह है कि बॉक्स (IL_0006 और IL_0011) विशिष्ट टाइप करें, इसलिए यह स्पष्ट रूप से int प्रकार का बॉक्स बना रहा है (यह केवल "अंतिम वैल्यूटाइप" नहीं है)।

इसके अलावा, "खाली मूल्यांकन स्टैक" भ्रामक है; यह बिल्कुल सही नहीं है - उदाहरण के लिए, call की एक निर्दिष्ट संख्या का उपभोग करता है - यह इसे "खाली" नहीं करता है। कभी भी "खाली मूल्यांकन स्टैक" अर्थपूर्ण नहीं है - यह हमेशा "कई मानों का उपभोग करता है, कई मान वापस रखता है" (जिनमें से कोई भी शून्य हो सकता है)।

+0

जब कुछ पदों की संख्या किसी चीज से खाई जाती है (उदाहरण के लिए कॉल करें), केवल शीर्ष पदों का उपभोग किया जाता है? और फिर मूल्यांकन स्टैक पर कई मूल्य वापस रखता है? मुझे लगता है कि यह सच है, क्योंकि यह सब के बाद 'स्टैक' है, लेकिन मैं बस यह सुनिश्चित करने के लिए कह रहा हूं। – ProgrammerAtWork

+1

हां। एक काल्पनिक ऑपरेशन जो ए, बी, सी, डी और वाई, जेड का उत्पादन करेगा, स्टैक * से 4 प्रविष्टियों को पॉप करेगा, परिणाम की गणना करें *, और उसके बाद 2 नई प्रविष्टियों को धक्का देगा। (*) उस क्रम में संक्षेप में नहीं, लेकिन धक्का हमेशा आखिरी होते हैं। – quetzalcoatl

3

हां, आपकी समझ लगभग पूरी तरह से सही है। एक बात: आईएल_0010 ढेर से लोड नहीं होता है, यह स्थानीय लोगों से लोड होता है। (स्थानीय रनटाइम स्टैक पर समाप्त होते हैं लेकिन आईएल स्तर पर उन्हें स्थानीय कहा जाता है)।

+0

ओपी स्टैक पर स्थानीय लोगों को अलग से "मूल्यांकन स्टैक" का वर्णन कर रहा है, लेकिन मैं मानता हूं कि उन्हें स्थानीय लोगों को कॉल करना बेहतर होगा। –

2

यह सही है, हालांकि मैं कुछ स्पष्ट नहीं शब्दों के साथ एक सा तर्क है चाहते हैं, उदाहरण के लिए: ढेर स्थिति 0 में

डाल मूल्यांकन ढेर स्थिति 0, मूल्यांकन ढेर

खाली हो जाने पर

मैं कहेंगे

ढेर-चर 0 में ढेर के ऊपर से 0 प्रविष्टि शब्दों में कहें, तो पॉप

सिर्फ इसलिए कि मुझे लगता है कि 'कम औपचारिक' शब्द ज्यादातर बार पढ़ने के लिए स्पष्ट है, लेकिन अन्यथा, यह ठीक लगता है।

संपादित करें: एचएम .. बाद में विचार में, मैं कहूंगा कि "स्टैक" और "मूल्यांकन स्टैक" जैसी कोई भी चीज़ नहीं है। केवल "ढेर" है। स्टैक के दृश्य भाग की शुरुआत का चिह्नित हिस्सा, स्थानीय चर के साथ एक जिसे "स्लॉट" कहा जा सकता है। मुझे लगता है कि आईएल के साथ, आप बस "स्थानीय परिवर्तनीय एनएच" कह सकते हैं और सबकुछ आमतौर पर स्पष्ट होगा, लेकिन मुझे लगता है कि कई अलग-अलग चर उसी स्लॉट में मैप किए जा सकते हैं, इसलिए इससे कुछ भ्रम हो सकता है। इसके अलावा, जब आप स्टैक के साथ काम करते हैं तो "खाली" जैसे कोई ऑपरेशन नहीं होता है। प्रतिलिपि बनाने के लिए केवल स्पष्ट रूप से निर्दिष्ट प्रविष्टियों की संख्या के साथ पुश/पॉप करें।