一切从IL开始

IL是什么?

  IL是Intermediate Language的缩写,是.Net代码转化成机器语言的一个中间语言,因此又把IL语言称之为反汇编语言。

IL工具有哪些?

  俗话说,工欲善其事必先利其器。了解IL就要首先从使用工具开始。在.Net世界里有数个不同的IL工具,包含编译器和反编译器。最经典的编译和反编译利器就是.Net Framework自带的ILASM.exe和ILDASM.exe工具,同时还有其他,例如Reflector.exe,ILSay.exe等等。

具体IL指令介绍

  要了解IL的指令,我们以一个非常简单的程序开始,源代码如下:

using System;

namespace HelloWorld
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

相信大家对这段代码再熟悉不过,对于编译后的可执行文件应用ILDasm.exe反编译工具,还原为文本MSIL编码,编译后的IL结构中,包含了MANIFEST和HelloWorld类,如下图所示:

其中MANIFEST是附加信息表,主要包含了程序集的一些属性,例如程序集名称、版本号、哈希算法、程序集模块等等,以及对外部引用程序集的引用项;下面我们重点根据Hello World类来介绍IL指令

  首先是Hello World类型,IL代码如下:

  >.class表明了HelloWorld是一个类,该类型继承自外部程序集mscorlib的System.Object类。

  >public为访问控制权限,表示具有最高的访问权限,为访问成员没有限制。

  >auto表示程序加载时内存的布局是有CLR决定的,而不是程序本身。

  >.ansi属性则为了在没有被托管和被托管的代码之间实现无缝转换。没有被托管的代码,值的是没有运行在CLR运行库之上的代码,例如原来的C,C++代码等。

  >.beforefieldinit属性为HelloWorld提供一个附加信息,用于标记运行库可以在任何时候执行类型构造函数方法,只要该方法在第一次访问其静态字段之前执行即可。如果没有beforefieldinit则运行库必须在某个精确时间执行构造函数方法,从而影响性能优化。

  然后是.ctor方法,代码如下:

  

  >.cil managed说明方法体中为IL代码,指示编译器编译为托管代码。

  >.maxstack表明执行构造函数.ctor期间的评估堆栈可容纳数据项的最大个数。关于评估堆栈,其用于保存方法所需变量的值,并在方法执行结束时清空,或者存储一个返回值。

  >.IL_0000,是一个标记码行开头,一般来说,IL_标记之前的部分为变量的声明和初始化。

  >.ldarg.0(ldarg即load argument)表示装载第一个成员参数,在实例方法中值的是当前实例的引用,该引用将用于积累构造函数中调用。

  >.call指令一般用于调用静态方法,因为静态方法是在编译期指定的,而在此处call并非调用静态方法,而是构造函数.ctor(),也是在编译期指定的;而另一个指令callvirt则表示调用实例方法,它的调用过程有异于call,函数的调用时在运行时确定的,首先会检查被调用函数是否为虚函数,如果不是就直接调用,如果是则向下检查子类是否有重现,如果有就调用重写实现,如果没有还调用原来的函数。

  >.ret表示执行完毕,返回。

  最后是Main方法,代码如下:

  

  >.entrypoint指令表明了CLR加载程序HelloWorld.exe时,是首先从.entrypoint方法开始执行的,也就是表明Main方法将作为程序的入口函数。没有托管程序必须有且只有一个入口程序。这区别于将Main函数作为程序入口标志。

  >.ldstr(即load string)指令表示将字符串压栈,“Hello World!”字符串将被移到stack顶部。CLR通过从元数据表中获取文字常量来构造string对象。

  >.hidebysig属性用于表示如果当前类作为父类时,类中的方法不会被子类继承。因此HelloWorld子类中不会看到Main方法。

  >.关于注释,IL代码中注释和C#等高级语言的注释相同。

参考:

《你必须知道的.Net》

时间: 2024-10-12 22:26:05

一切从IL开始的相关文章

Atitit..net clr il指令集 以及指令分类  与指令详细说明

Atitit..net clr il指令集 以及指令分类  与指令详细说明 1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM), 1 1.2. 查看工具ILDASM1 1.3. 此程式执行时,关键的记忆体有三种,分別是:1 1.4. Il指令集2 1.4.1. Mov指令3 1.4.2.  跳转指令集合6 1.4.3.  算术 逻辑 与移位指令8 1.4.4. 类型转换9 1.4.5. Other  and oo指令10 2. 参考12 1.1. 

uva 260 - Il Gioco dell'X

题解: 一定有人获胜,非黑即白:获胜条件为:black是由 上走到下,white是由 左走到右: 1 #include <cstdio> 2 using namespace std; 3 int N; 4 char board[201][201]; 5 const int direction[][2] = {{-1,-1},{-1,0},{0,-1},{0,1},{1,0},{1,1}}; 6 void DFS(int i, int j, char c,int &win) 7 { 8

IL指令

这是网上搜集到的il指令修改时可作为参考 名称说明Add将两个值相加并将结果推送到计算堆栈上.Add.Ovf将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上.Add.Ovf.Un将两个无符号整数值相加,执行溢出检查,并且将结果推送到计算堆栈上.And计算两个值的按位“与”并将结果推送到计算堆栈上.Arglist返回指向当前方法的参数列表的非托管指针.**********************************************************************

【深入浅出.Net IL】1.一个For循环引发的IL

1.准备工作 (1)新建一个project using System; namespace newArr { class Program { static void Main(string[] args) { char[] arrchars = new char[5]; for (int i = 0; i < 5; i++) { arrchars[i] = 'a'; Console.WriteLine(arrchars[i]); } Console.WriteLine("123"

在Visual Studio里配置及查看IL(转载)

原文地址:http://www.myext.cn/other/a_25162.html 在之前的版本VS2010中,在Tools下有IL Disassembler(IL中间语言查看器),但是我想直接集成在VS2012里使用,方法如下: 1.选择 工具/外部工具,打开外部工具 2.点击右侧的 “添加”按钮,填写相关的参数 标题:ILDASM 命令:就是ildasm.exe的安装路径,根据情况选择自己磁盘上的路径 参数:注意这里需要选目标文件路径 初始目录:目标文件目录 3.添加完之后,可以在工具选

CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码

CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集,所以不能使用IL DASM进行查看,但CLR以dll的形式位于.NET版本号文件夹内. □ C#源代码从编译到CLR运行的全过程 →编写C#源代码,以class,struct,enum,interface,delegate...的形式 →编译器把源代码编译成.dll或.exe,其中包含了一些重要信息

认识IL代码---从开始到现在 &lt;第二篇&gt;

·IL代码分析方法 ·IL命令解析 ·.NET学习方法论 1.引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持,给予了anytao巨大的鼓励和动力.俱往昔,我发现很多的园友都把目光和焦点注意在如何理解IL代码这个问题上.对我来说,这真是个莫大的好消息,因为很明显我们的思路慢慢的从应用向底层发生着转变,技巧性的东西是一个方面的积累,底层的探索在我认为也是必不可少的修炼.如果我们选择了来关注这项修炼,那么我们就应该选择如何来着手这项修炼,首先关注anytao的『你必须知道的.N

认识元数据和IL(下)&lt;第五篇&gt;

书接上回: 第二十四回:认识元数据和IL(上) , 第二十五回:认识元数据和IL(中) 我们继续. 终于到了,说说元数据和IL在JIT编译时的角色了,虽然两个回合的铺垫未免铺张,但是却丝毫不为过,因为只有充分的认知才有足够的体会,技术也是如此.那么,我们就开始沿着方法调用的轨迹,追随元数据和IL在那个神秘瞬间所贡献的力量吧 5 元数据和IL在JIT编译时 CLR最终执行的只有本地机器码,所以JIT编译的作用是在运行时将IL代码解析为机器码执行.对于JIT编译,我们会以专门的篇幅来全面了解,本文只

从Hello, world开始认识IL &lt;第一篇&gt;

IL代码分析方法 Hello, world历史 .NET学习方法论 1.引言 1988年Brian W.Kernighan和Dennis M.Ritchie合著了软件史上的经典巨著<The C programming Language>,我推荐所有的程序人都有机会重温这本历史上的经典之作.从那时起,Hello, world示例就作为了几乎所有实践型程序设计书籍的开篇代码,一直延续至今,除了表达对巨人与历史的尊重,本文也以Hello, world示例作为我们扣开IL语言的起点,开始我们循序渐进的

认识元数据和IL(中)&lt;第四篇&gt;

书接上回[第二十四回:认识元数据和IL(上)],我们对PE文件.程序集.托管模块,这些概念与元数据.IL的关系进行了必要的铺垫,同时顺便熟悉了以ILDASM工具进行反编译的基本方法认知,下面是时候来了解什么是元数据,什么是IL这个话题了,我们继续. 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注