4

请看下面的 MSIL 代码:

IL_00:  ldstr      "Hello World"
IL_05:  call       void [mscorlib]System.Console::WriteLine(string)
IL_10:  ret

IL_00、IL_05 和 IL_10 是什么意思?我在大学读过操作系统概念,所以当时我了解 Windows 操作系统如何为进程分配虚拟内存。我也不明白为什么在上述情况下;地址以 5 递增。

托管代码是从 VB.NET 应用程序生成的。

我花了一些时间在谷歌上搜索这个,我已经阅读了 MSDN 上的一些文章。我仍然不清楚,因此问题的原因。

4

1 回答 1

6

它们只是您的 IL 反汇编程序生成的虚假“地址”。LDSTR 操作码需要 1 个字节作为操作码、0x72 和 4 个字节作为操作数。这是一个标记值,它从存储字符串文字的元数据表中选择字符串。所以下一个 IL 操作码从偏移量 5 开始。同样的配方,CALL 需要一个字节用于操作码,0x28,以及 4 个字节用于操作数,方法令牌。所以下一个 IL 操作码从偏移量 10 开始。RET 需要 1 个字节,0x2A,并且没有操作数。IL 代码总大小为 11 个字节。

您的反汇编程序生成这些“地址”以向您显示分支指令的目标。您没有,请尝试反汇编使用 if() 语句的代码来查看。它们在其他方面无关紧要,因为抖动将此代码转换为看起来非常不同的机器代码。

于 2013-01-27T11:24:19.247 回答