我有三年全职使用 .NET(C# 和 VB)的经验。我对 MSIL 有很好的工作知识,可以将它用作调试工具。
我对编译过程的下一步知之甚少,即 Jitter 何时生成汇编代码(显示在 dissassebly 窗口中)。Hans Passant 在这里发布了一个问题的答案:本机代码、机器代码和汇编代码有什么区别?. 我更有经验的同事说这是一个绝妙的答案,但我仍然不明白以下代码:
static void Main(string[] args) {
Console.WriteLine("Hello world");
00000000 55 push ebp ; save stack frame pointer
00000001 8B EC mov ebp,esp ; setup current frame
00000003 E8 30 BE 03 6F call 6F03BE38 ; Console.Out property getter
00000008 8B C8 mov ecx,eax ; setup "this"
0000000a 8B 15 88 20 BD 02 mov edx,dword ptr ds:[02BD2088h] ; arg = "Hello world"
00000010 8B 01 mov eax,dword ptr [ecx] ; TextWriter reference
00000012 FF 90 D8 00 00 00 call dword ptr [eax+000000D8h] ; TextWriter.WriteLine()
00000018 5D pop ebp ; restore stack frame pointer
}
00000019 C3 ret ; done, return
谁能提供更多关于每行发生的事情的信息,尤其是为什么选择每个寄存器,例如为什么选择 eax 而不是 edx?或者有人可以推荐一本书吗?