如何正确反汇编.NET代码?

时间:2017-06-16 19:27:07

标签: c# .net assembly cil disassembly

我正在尝试反汇编我的C#代码,然后在汇编语言级别调试它。 假设我们有一个简单的C#方法:

var a = 1235;
var b = ++a;
var c = ++b;

Console.WriteLine("test");
Console.ReadKey();

我发现了两种不同的方法来获取汇编代码。 第一个是在VS中启动C#代码调试,然后打开反汇编窗口。这里我们有以下代码。

first method assembly

一切都很好,汇编代码非常简单和简短,但问题是这个汇编代码的逻辑与 ildasm 生成的IL代码的逻辑不同。

cil code

所以这是第二种方式。我们可以编译C#代码,使用 ildasm 从PE文件中获取IL代码,然后使用 ilasm 生成PE文件。现在我们有以下汇编代码。

second method code

正如您所看到的,这个汇编代码更像IL代码,但它包含更多指令,而且更复杂。

AFAIK C#编译为CIL代码,然后编译为汇编代码。但它似乎是第一种方式,它只是编译成汇编代码。

所以问题是为什么第一种方法的汇编代码与IL代码不同?为什么第一种方法的汇编代码与第二种方法的汇编代码不同?

1 个答案:

答案 0 :(得分:3)

JIT能够重新订购和合并机器指令作为优化,但会尽量避免在pdb提供的sequence points之间移动效果。编译器通常会为每行代码生成一个序列点,因为您通常一次只执行一行。

虽然C#经常会为每行代码生成多个IL指令,但是ilasm会明确地给出每条指令,因此生成更多的序列点,从而为JIT优化留下更少的空间。