il代码底层运行机制

il代码底层运行机制

ID:15389232

大小:83.50 KB

页数:7页

时间:2018-08-03

il代码底层运行机制_第1页
il代码底层运行机制_第2页
il代码底层运行机制_第3页
il代码底层运行机制_第4页
il代码底层运行机制_第5页
资源描述:

《il代码底层运行机制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、IL代码底层运行机制     刘强   Cambest@sohu.com2003年5月8日       大家都知道,和Java一样,C#也是基于堆栈的语言。也许对一般人来说,底层的运行细节并不是很重要;但了解这些,对我们理解、运用C#是很有帮助的。下面,我就通过一个很简单的例子来说明IL代码的底层运行机制,也许对你会有一些帮助。       我给出的例子表面上看是一个实现整数相减功能的函数;实际上,我也不知道究竟能够干什么。在实际当中,我们的程序当中会有很多种数据类型、引用类型,为了简便起见,我所给出的示例代码只用了一

2、种数据类型,如下所示:publicintSub(inti,intj)       {           ints;           intt=0;           intr=4;           s=i;           r=i–j;           r+=s+t;           returnr;       }这段代码很简单,任何学过C#的人都能看懂。首先,传入两个整型变量i和j,然后经过内部运算,返回一个整型值。函数体内定义了三个局部变量s,t,r,分别用于保存自定义值以及结果。我们可以

3、将它包装进一个类中,然后将它编译成.dll装配件。运用VS.NET自带的ildasm反汇编工具进行反汇编,我们得到如下IL代码:.methodpublichidebysiginstanceint32 Sub(int32i,int32j)cilmanaged{ //Codesize      22(0x16) .maxstack 3 .localsinit(int32V_0,int32V_1,int32V_2,int32V_3)   ldc.i4.0   stloc.1   ldc.i4.4   stloc.2   ld

4、arg.1   stloc.0   ldarg.1   ldarg.2   sub   stloc.2   ldloc.2   ldloc.0   ldloc.1   add   add   stloc.2   ldloc.2   stloc.3   br.s      IL_0014   ldloc.3   ret}IL代码也可以由VS.NET自带的IL编译工具ilasm编译为.dll装配件或.exe可执行文件。这里,我要对IL中出现的符号作一下简单解释。以点号’.’开头的标号为伪指示代码,只起指示作用,最终不会被J

5、IT编译为本地可执行代码,如“.method”,“.locals”等。而不带点号’.’的标号为IL汇编代码,它们在运行时将会被JIT编译为本地可执行代码,如“ldarg.1”等。每条语句究竟代表了什么样的操作,我们下面在详细讲解。注意:局部变量的下标从0开始,因此要注意我下面所说的“第零个局部变量”等的含义。首先,让我们看一看函数体内的第一条语句:.maxstack 3。从其本身我们也可以猜出该语句说明堆栈的大小。暂且不表,且看下文。第二句:.localsinit(int32V_0,int32V_1,int32V_2,

6、int32V_3)。V_0、V_1、V_2和我们在CS源程序中定义的局部变量s,t,r一一对应,我们大概也能猜到这一句是完成局部变量初始化工作的,但为什么在这里是四个呢?我们明明只定义了三个变量的。那么这由C#编译器自动维护的第四个变量有何作用?也暂且不表,先看下文。ldc.i4.0这条语句作用是在堆栈中载入常数,i4表示该常数为双字长的32位整型数,初始值为0。“ldc”可以理解为“loadconstant”,加载常数。如图a,它完成的操作如同(top)<=0,top=top+1。        stloc.1这条语

7、句作用是将当前栈顶元素存入第一个局部变量。’1’表示操作对象为第一个局部变量。“stloc”可以理解为“storetolocal”,保存局部变量。如图b,它完成的操作如同top=top-1,s<=(top)。        ldc.i4.4这条语句完成的操作如同(top)<=4,top=top+1,如图c。        stloc.2这条语句完成的操作如同top=top-1,t<=(top),如图d。        ldarg.1        ldarg.2这两条语句作用是在堆栈中载入第一个参数(i)、第二个参数(

8、j)(和局部变量不同,参数的指示下标从1开始)。它完成的操作如同(top)<=i,top=top+1,(top)<=j,top=top+1,如图e。其中,“ldarg”可以理解为“loadargument”,加载参数。        sub这条语句作用是将当前栈顶元素求反,再下加到第二个栈单元中,如图f。它完成的操作如同top=t

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。