.NET函数反汇编了第2部分

时间:2011-02-12 13:26:20

标签: c# x86 native jit

在分解处理对象和实例调用的.NET代码时,我发现有一些我不太了解的东西:

这是我的测试代码:

class Foo
{
   public void Bar()
   {
       Console.WriteLine("hello");
   }
}

...

var foo = new Foo();
foo.Bar();

这是反汇编的结果(优化)

15:             var foo = new Foo();
00000019  mov         ecx,403880h           //ecx = address of Foo type ?
0000001e  call        FFF71FB0              //call ctor ?
00000023  mov         esi,eax               //esi = result ?

16:             foo.Bar();
00000025  call        63377060  //this seems to be console.writeline inlined (from bar)
0000002a  mov         ecx,eax 
0000002c  mov         edx,dword ptr ds:[03612034h] 
00000032  mov         eax,dword ptr [ecx] 
00000034  mov         eax,dword ptr [eax+3Ch] 
00000037  call        dword ptr [eax+10h] // esi.Bar() ?

我猜第一部分是关于加载Foo类型然后调用它上面的构造函数?

但剩下的呢?

另一个奇怪的是代码生成以下IL:

L_0017: callvirt instance void CSApp.Foo::Bar()

为什么它在非虚方法上执行callvirt? 这是本机代码中发生的事情吗? vtable查找?

0 个答案:

没有答案