2010-09-08 46 views
9

我花了幾個小時在一個調試問題上,只讓一個更有經驗的人看IL(類似於00400089 mov dword ptr [ebp-8],edx)並指出了問題。老實說,這看起來像希伯來語 - 我不知道它說的是什麼。如何成爲MSIL專家?

我在哪裏可以學到更多關於這個東西的知識,並且給我周圍的每個人留下深刻的印象?我的目標是閱讀以下內容並發表評論,例如:你有競爭條件。

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

ldloca mclass 
ldc.i4 5 
+5

哈哈,「我在哪裏可以學到更多關於這個東西的知識並且給我周圍的人留下深刻印象。」這是兩個*完全*不同的問題,我的朋友;)除非你獨自呆在書呆子(如我),我猜... – 2010-09-08 01:42:35

回答

4

要在IL得到很大的,與這個夢幻般的文章開始:Introduction to IL Assembly Language。雖然它說「介紹」,但它是你需要開始舒適的一切。

你需要什麼,另一部分是實踐和它的地段。使用.NET Reflector並開始查看反彙編爲IL的代碼。 (提示:當你下載它時,你不必提供真正的電子郵件。)另外,請使用Reflector中的Reflexil插件。這是一個很好的起點:Assembly Manipulation and C#/VB.NET Code Injection

沒有必要,但獎金:Reflexil是開源。你可以得到源here

7

這不是MSIL,它是彙編語言80x86。

+3

難怪我不知道發生了什麼事。 – RonT 2010-09-08 01:05:51

+5

多年以前,最近在一個AES加密程序中進行了彙編工作,我可以告訴你,你不應該試圖通過試圖在彙編程序上學習c#來淡化你的努力。如果你的原始代碼是在c#中,你應該能夠檢測到原始代碼中的競爭條件。 – Bill 2010-09-08 01:09:00

3

我可以給你一個雙向運行的答案。

,一方面,沒有什麼能像好彙編語言技巧,教你如何在計算機運行真的。 MSIL在某種程度上是類似彙編語言。不利的一面是,再也沒有機會做這種發展。

在另一方面,訴諸看MSIL解決問題不一定是最直接的還是教育的方式來了解一個問題。在五年的.NET編程中,我從未覺得有必要去那裏。只有一次有一名同事(曾在微軟工作過編譯器測試)帶着一個我試圖解決的問題走到那裏,最後,他的回答是誤導性的,因爲真正的問題是基於CLR設計和約束。更好地瞭解CLR和C#將會帶來更好的理解和真正的解決方案。 (如果你想知道,問題是我想用「as」來安全地使用泛型進行投射,「因爲」沒有工作,但「卻」有效「,我的同事注意到「is」和「as」使用相同的MSIL,真正的問題是「as」只適用於類的類型,如果沒有適當的泛型聲明約束,C#不知道泛型是否是類。實際上,我在泛型中使用的類型是價值類型;「as」根本無法用於這些類型。)

我非常推薦Jeffrey Richter的書CLR via C#.即使經過多年的挖掘努力研究C#,這本書仍然充滿了啓示 - 我從每一頁都學到了一些東西。

+0

「as」不適用於值類型的原因是值類型不能爲null,但如果變量不是所提供的類型,則'as'想返回null。如果你知道你的泛型類型參數'T'是一個值類型(即你已經指定了'struct'約束),那麼你可以使用'as T?'而不是'T'作爲它,即使實例實際上是'T'類型而不是'T''。然而,這是一個純粹的C#語言問題,與IL或CL​​R無關...... – Timwi 2010-09-08 01:25:04

+0

@Timwi,完全正確; 「as」不能在值類型上返回null,並且這絕對**完全與IL無關。這纔是重點;學習IL並不能幫助你解決這樣的問題。無論這純粹是一種語言問題,還是涉及泛型的CLR實現,我都不能說,但我會注意到VB.NET處理鑄造(通過DirectCast或TryCast)具有很多相同的問題。 – 2010-09-08 01:30:07

3

不能說我是一個IL「親」,但我設法通過執行以下操作來教自己幾乎所有的IL:

  • 寫很短(二,三線) C#程序,你很好奇如何在IL中編寫代碼。

  • 編譯程序。

  • .NET Reflector打開編譯EXE。

  • 查看Reflector中該方法的IL代碼。

  • 將鼠標懸停在IL操作碼(例如「ldloc」)上。 有一個工具提示描述每個IL指令。