2012-04-21 11 views
19

पर आईएल कैसे सीखें इन आईएल कोडों के बाद से मैं और क्या देखता हूं, मैं सीखना चाहता हूं कि उन्हें सही तरीके से कैसे समझना है।सीएलआर

मैं सी # संकलक या किसी अन्य इसलिए मुझे लगता है मैं बहुत ज्यादा के बाद मैं इस आम लोगों सीखना बाकी की देखभाल कर सकते हैं की तरह एक प्रलेखन नहीं मिल सका:

नीचे कुछ नमूना आईएल युक्त मैं क्या जरूरत कोड हैं पता करने के लिए:

नमूना 1:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  15 (0xf) 
    .maxstack 1 
    .locals init ([0] class EnumReflection.DerivedClass derivedClass) 
    IL_0000: nop 
    IL_0001: newobj  instance void EnumReflection.DerivedClass::.ctor() 
    IL_0006: stloc.0 
    IL_0007: ldloc.0 
    IL_0008: callvirt instance void EnumReflection.DerivedClass::WriteOutput() 
    IL_000d: nop 
    IL_000e: ret 
} // end of method Program::Main 

नमूना 2:

.method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
{ 
    // Code size  38 (0x26) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: ldstr  "Hello" 
    IL_0006: stfld  string EnumReflection.DerivedClass::hello 
    IL_000b: ldarg.0 
    IL_000c: ldstr  "World" 
    IL_0011: stfld  string EnumReflection.DerivedClass::world 
    IL_0016: ldarg.0 
    IL_0017: ldc.i4.s 123 
    IL_0019: stfld  int32 EnumReflection.DerivedClass::age 
    IL_001e: ldarg.0 
    IL_001f: call  instance void EnumReflection.BaseClass::.ctor() 
    IL_0024: nop 
    IL_0025: ret 
} // end of method DerivedClass::.ctor 

मुझे पता है कि इन कोडों के बाद से ये कोड क्या करते हैं :-) हालांकि मैं संबंधित आईएल कोड के बारे में अधिक जानना चाहता हूं।

इन नमूनों में आईएल कोड जैसे शामिल हैं और क्या आप प्रश्न चिह्नों के साथ कमांड को समझा सकते हैं? और यह आदेश भी किसके लिए खड़ा है? तो हम उन्हें आसानी से याद कर सकते हैं।

  • nop (डिबगिंग के लिए - कोई आपरेशन)
  • newobj
  • stloc.0 (यह ढेर में नई वस्तु पैदा कर रही है लगता है)?
  • ldloc.0?
  • ret?
  • ldarg.0?
  • ldstr?
  • stfld?
  • ldc.i4.s?
  • .ctor - निर्माता

आईएल को समझना महत्वपूर्ण है क्योंकि यह उजागर करता है कि कैसे विशेष संकलक विशिष्ट मामलों में कोड और कार्य उत्पादन होता है।

हालांकि, मुझे एक अच्छा दस्तावेज़ नहीं मिला जिसमें आईएल के बारे में उदाहरण भी शामिल हैं। सी # 3.0 के साथ सीएलआर एक अच्छी किताब है हालांकि आखिरकार यह आईएल बुक नहीं है, इसलिए यह आईएल के बारे में सब कुछ समझा नहीं है।

संपादित करें:

मैं चश्मा मिल गया है और वे इन बता: धन्यवाद @usr करने के लिए।

  • nop (डिबगिंग के लिए - कोई आपरेशन)
  • newobj - ढेर से स्थानीय चर को
  • ldloc.0 पॉप मूल्य - एक नया वस्तु
  • stloc.0 बनाने? - स्टैक
  • पर स्थानीय चर लोड करें
  • ldarg.0 - स्टैक पर लोड तर्क 0 लोड करें।
  • ldstr - दुकान एक वस्तु
  • ldc.i4.s के क्षेत्र में - - पुश संख्या int32, लघु फार्म के रूप में ढेर पर एक शाब्दिक स्ट्रिंग
  • stfld लोड।
  • .ctor - निर्माता
+1

:।। मैं अपने सवाल ... – Tarik

+0

संपादित मैं शीर्षक बदल रहा। लगता है कि यह एक पूरी तरह से वैध सवाल है। – usr

+0

@usr: शीर्षक परिवर्तन के लिए धन्यवाद, यह सु अब अच्छा लग रहा है। – Tarik

उत्तर

7

Microsoft standardized the CLR and published those standards। विभाजन III में आईएल/सीआईएल के बारे में जानकारी है और सीखने के लिए उपयुक्त है। यह एक उत्कृष्ट दस्तावेज है।

उदाहरण के साथ आप आईएल भी सीख सकते हैं। सी # में कुछ सरल तरीकों को संकलित करें और आईएल को परावर्तक में देखें (इसमें आईएल-मोड है)।

+0

मैंने यही किया हालांकि मैं इन आदेशों के लिए भी खड़ा हूं। – Tarik

+0

हां, मैं आपको तब spec में देखने की सलाह देते हैं। विभाजन III वास्तव में बहुत अच्छा और समझ में आता है। – usr

+0

मुझे यह पता चला है कि मैं वास्तव में इस पीडीएफ फ़ाइल में चश्मा में क्या देख रहा हूं: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf – Tarik

7

यदि आप प्रत्येक ऑपोड के संक्षिप्त सारांश चाहते हैं, तो आप System.Reflection.Emit नामस्थान का निरीक्षण करने से भी बदतर हो सकते हैं।

उदाहरण के लिए, OpCodes कक्षा है जिसमें प्रत्येक ऑपोड के लिए एक स्थिर क्षेत्र है। इसके बाद इनमें से प्रत्येक को इसके ढेर व्यवहार के संदर्भ में आगे विस्तार से वर्णित किया गया है। जैसे Ldarg_0:

ldarg.0 अनुदेश तर्क मूल्यांकन ढेर पर 0 पर अनुक्रमित धक्का। ldarg.0 निर्देश किसी आवक तर्क से प्रतिलिपि बनाकर स्टैक पर मूल्य प्रकार या आदिम मान लोड करने के लिए उपयोग किया जा सकता है।

11

कुछ किताबें कि आईएल को कवर करते हैं:

कुछ books on reverse engineering आईएल पर अनुभाग हैं।

यह भी देखें:

8
  • nop - कोई को-अप
  • newobj - एक वस्तु बना सकते हैं और इसके निर्माता कहते हैं।
  • stloc.0 - ढेर से एक मूल्य के पॉप, और पहले स्थानीय चर में यह
  • ldloc.0 की दुकान - लौट
  • ldarg.0 - ढेर पर
  • सेवानिवृत्त पहले स्थानीय चर पुश - ढेर पर
  • ldstr पहला तर्क (उदाहरण के तरीकों में this) पुश - ढेर पर
  • stfld एक स्ट्रिंग पुश - क्षेत्र निर्धारित करते हैं, ढेर पर डेटा का उपयोग कर।
  • ldc.i4.s - निर्दिष्ट संख्या को int के रूप में पुश करें।
  • .ctor - निर्माता

मैं सुझाव है कि आप एक अच्छा इन opcodes पर दस्तावेजीकरण का स्रोत लगता है कि (विकिपीडिया सबसे अच्छा हो सकता है, हालांकि :() System.Reflection.Emit के लिए दस्तावेज़ काफी विस्तृत प्रलेखन है। । opcodes के लिए

और सब से ऊपर, करीब मतदाता करने के लिए छोटे कार्यक्रमों का निर्माण और आईएल आउटपुट का परीक्षण यही कारण है कि सबसे अच्छा तरीका जानने के लिए है

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