我試圖反彙編我的C#代碼,然後在彙編語言級別進行調試。 比方說,我們有一個簡單的C#方法:如何正確反彙編.NET代碼?
var a = 1235;
var b = ++a;
var c = ++b;
Console.WriteLine("test");
Console.ReadKey();
我發現了兩種不同的方式如何獲取彙編代碼。 第一個是在VS中啓動C#代碼調試,然後打開Disassembly窗口。這裏我們有以下代碼。
一切行和彙編代碼是非常簡單和短,但問題是,這個彙編代碼邏輯由ILDASM產生的IL代碼的邏輯是不同的。
因此,這裏是第二種方式。我們可以編譯C#代碼,使用ILDASM獲得從PE文件中的IL代碼,然後用ILASM生成PE文件恢復。現在我們有以下彙編代碼。
正如你可以看到這個彙編代碼更像是IL代碼,但它包含更多的指令,這是更爲複雜。
AFAIK C#編譯爲CIL代碼,然後在這兩種情況下的彙編代碼。但它似乎是以第一種方式編譯爲彙編代碼。
所以,問題是爲什麼第一方法的彙編代碼從IL代碼不同?爲什麼第一種方法的彙編代碼與第二種方法的彙編代碼不同?
CLR是一個虛擬機,因此代碼的區別。類似於Java的JVM。 – t0mm13b
這是調試模式的代碼(你可能有「禁止對模塊加載JIT優化」打開),這樣不是很有趣,但奇怪的是,這取決於它是否已經通過反彙編/ ILASM往返走了是不同的。 – harold
這不是一個「問題」,它是一個功能。在使用Release版本並關閉Suppress JIT優化選項時,僅查看機器代碼是明智的。 –