2010-09-08 19 views
9

मैंने डीबगिंग समस्या पर घंटों बिताए हैं केवल आईएल (00400089 mov dword ptr [ebp-8], edx जैसे कुछ और अनुभवी व्यक्ति को देखने के लिए) और समस्या को इंगित करें। ईमानदारी से, यह मुझे हिब्रू की तरह दिखता है - मुझे नहीं पता कि यह बिल्ली क्या कह रहा है।एमएसआईएल समर्थक कैसे बनें?

मैं इस सामान के बारे में और अधिक कहां से सीख सकता हूं और मेरे आस-पास के सभी को प्रभावित कर सकता हूं? मेरा लक्ष्य निम्नलिखित की तरह सामान पढ़ना है और इस तरह की टिप्पणी करना है: ये, आपके पास दौड़ की स्थिति है।

.maxstack 2 
.entrypoint 
.locals init (valuetype [MathLib]HangamaHouse.MathClass mclass) 

ldloca mclass 
ldc.i4 5 
+5

हाहा, "मैं इस सामान के बारे में और कहां से जान सकता हूं और मेरे आस-पास के सभी को प्रभावित कर सकता हूं।" वे दो * पूरी तरह से * अलग-अलग प्रश्न हैं, मेरे दोस्त;) जब तक आप विशेष रूप से नरों (मेरे जैसे) के साथ बाहर नहीं रहते हैं, मुझे लगता है ... –

उत्तर

4

आईएल में महान होने के लिए, इस शानदार लेख से शुरू करें: Introduction to IL Assembly Language। यद्यपि यह "परिचय" कहता है, यह सब कुछ है जो आपको आरामदायक होने के लिए आवश्यक है।

आपको जो चाहिए वह दूसरा हिस्सा अभ्यास है और इसमें से बहुत कुछ है। .NET Reflector का उपयोग करें और आईएल में अलग कोड को देखना शुरू करें। (युक्ति: जब आप इसे डाउनलोड करने के लिए जाते हैं, तो आपको वास्तविक ईमेल प्रदान करने की आवश्यकता नहीं होती है।) इसके अलावा, प्रतिबिंबक में Reflexil प्लगइन के साथ खेलो। इसके लिए यहां एक अच्छा प्रारंभिक बिंदु है: Assembly Manipulation and C#/VB.NET Code Injection

आवश्यक नहीं लेकिन बोनस: रिफ्लेक्सिल ओपन सोर्स है। आप स्रोत here प्राप्त कर सकते हैं।

7

यह एमएसआईएल नहीं है, यह असेंबली लैंगेज 80x86 है।

+3

कोई आश्चर्य नहीं कि मुझे नहीं पता कि क्या हो रहा है। – RonT

+5

कई सालों पहले असेंबली में काम करने के बाद, हाल ही में एईएस क्रिप्टोग्राफिक दिनचर्या पर, मैं आपको बता सकता हूं कि आपको असेंबलर पर हड्डी लगाने की कोशिश करके सी # सीखने के अपने प्रयासों को कम करने का प्रयास नहीं करना चाहिए। यदि आपका मूल कोड सी # में था तो आपको मूल कोड में दौड़ की स्थिति का पता लगाने में सक्षम होना चाहिए था। – Bill

3

मैं आपको एक उत्तर दे सकता हूं जो दोनों तरीकों से चलता है।

एक तरफ, कंप्यूटर को वास्तव में संचालित करने के तरीके के बारे में आपको सिखाए जाने के लिए अच्छी असेंबली भाषा कौशल जैसी कोई बात नहीं है। एमएसआईएल कुछ हद तक एक असेंबली जैसी भाषा है। नीचे की तरफ, इस तरह के विकास को करने के लिए बहुत कम अवसर हैं।

दूसरी ओर, किसी समस्या को हल करने के लिए एमएसआईएल को देखने का प्रयास करना एक समस्या को समझने का सबसे प्रत्यक्ष या शैक्षिक तरीका नहीं है। .NET प्रोग्रामिंग के पांच वर्षों में, मैंने कभी वहां जाने की आवश्यकता महसूस नहीं की है। केवल एक बार सह-कार्यकर्ता (जिसने माइक्रोसॉफ्ट में कंपाइलर परीक्षण पर काम किया था) वहां एक समस्या के साथ चला गया जहां मैं हल करने की कोशिश कर रहा था, और अंत में, उसका जवाब भ्रामक था, क्योंकि असली मुद्दा सीएलआर डिजाइन और बाधाओं में आधारित था । सीएलआर और सी # के बेहतर ज्ञान से बेहतर समझ और वास्तविक समाधान हुआ होगा।

(यदि आप सोच रहे हैं, तो समस्या यह थी कि मैं सामान्य के साथ सुरक्षित कास्टिंग के लिए "as" का उपयोग करना चाहता था। "जैसा कि" काम नहीं किया, लेकिन "है" किया। मेरे सहकर्मी ने नोट किया कि "है" और "जैसा" एक ही एमएसआईएल का उपयोग करता है। वास्तविक समस्या यह है कि "as" केवल कक्षाओं को कास्टिंग करने के लिए काम करता है, और सामान्य घोषणा पर उचित बाधा के बिना, सी # यह नहीं जानता कि आपका सामान्य प्रकार एक वर्ग होगा या नहीं। वास्तव में, जिन प्रकारों का मैं जेनरिक के साथ उपयोग कर रहा था वे मूल्य प्रकार थे; "as" उन लोगों के लिए काम नहीं कर सका।)

एमएसआईएल कौशल के लिए जाने की बजाय, मैं अत्यधिक जेफरी रिचटर की पुस्तक CLR via C#. की खुदाई के वर्षों के बाद भी अनुशंसा करता हूं सी # में कड़ी मेहनत, यह पुस्तक अभी भी रहस्योद्घाटन से भरा है - मैं हर पृष्ठ से कुछ सीखता हूं।

+0

'as' मान प्रकारों के साथ काम नहीं करता है क्योंकि मान प्रकार 'शून्य' नहीं हो सकते हैं, लेकिन 'जैसा' प्रदान किया गया है' वैरिएबल' null' वापस करना चाहता है यदि चर उपलब्ध प्रकार का नहीं है। यदि आप जानते हैं कि आपका सामान्य प्रकार पैरामीटर 'टी' एक मान प्रकार है (यानी आपने 'स्ट्रक्चर' बाधा निर्दिष्ट की है), तो आप 'टी' के बजाय' as t? 'का उपयोग कर सकते हैं और यह उदाहरण के बावजूद भी काम करेगा वास्तव में टाइप 'टी' है और' टी? 'नहीं है। हालांकि, यह पूरी तरह से सी # भाषा मुद्दा है और आईएल या सीएलआर के साथ बहुत कुछ नहीं है ... – Timwi

+0

@Timwi, बिल्कुल सही; "जैसा" एक मान प्रकार पर शून्य नहीं लौटा सकता है, और इसमें ** ** ** आईएल के साथ कुछ भी नहीं है। यही तो बात है; सीखना आईएल इस तरह के मामलों को हल करने में आपकी मदद नहीं करता है। चाहे यह पूरी तरह से एक भाषा मुद्दा है, या जेनेरिक के सीएलआर कार्यान्वयन को शामिल करता है, मैं नहीं कह सकता था, लेकिन मैं ध्यान दूंगा कि वीबी.नेट के कास्टिंग (डायरेक्टकास्ट या ट्राईकास्ट के माध्यम से) की हैंडलिंग में भी यही समस्या है। –

3

नहीं कह सकते हैं कि मैं एक आईएल हूँ "समर्थक" है, लेकिन मैं अपने आप को काफी निम्न कार्य करके आईएल के सभी सिखाने में कामयाब रहे:

  • लिखें एक बहुत ही कम (दो या तीन लाइन) सी # प्रोग्राम जो आप आईएल में लिखने के बारे में उत्सुक हैं।

  • प्रोग्राम संकलित करें।

  • .NET Reflector में संकलित EXE खोलें।

  • परावर्तक में विधि के लिए आईएल कोड देखें।

  • अपने माउस को आईएल ओपोड (जैसे "ldloc") पर होवर करें। प्रत्येक आईएल निर्देश का वर्णन करने वाला टूलटिप है।

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