IL代码底层运行机制.doc

上传人:pu****.1 文档编号:558045376 上传时间:2022-10-06 格式:DOC 页数:7 大小:83.51KB
返回 下载 相关 举报
IL代码底层运行机制.doc_第1页
第1页 / 共7页
IL代码底层运行机制.doc_第2页
第2页 / 共7页
IL代码底层运行机制.doc_第3页
第3页 / 共7页
IL代码底层运行机制.doc_第4页
第4页 / 共7页
IL代码底层运行机制.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《IL代码底层运行机制.doc》由会员分享,可在线阅读,更多相关《IL代码底层运行机制.doc(7页珍藏版)》请在金锄头文库上搜索。

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

2、i; r =i j; r + =s + t; return r; 这段代码很简单,任何学过C#的人都能看懂。首先,传入两个整型变量i和j,然后经过内部运算,返回一个整型值。函数体内定义了三个局部变量s,t, r,分别用于保存自定义值以及结果。我们可以将它包装进一个类中,然后将它编译成.dll装配件。运用VS.NET自带的ildasm反汇编工具进行反汇编,我们得到如下IL代码:.method public hidebysig instance int32 Sub(int32 i, int32 j) cil managed / Code size 22 (0x16) .maxstack 3 .lo

3、cals init (int32 V_0, int32 V_1, int32 V_2, int32 V_3) ldc.i4.0 stloc.1 ldc.i4.4 stloc.2 ldarg.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 retIL代码也可以由VS.NET自带的IL编译工具ilasm编译为.dll装配件或.exe可执行文件。这里,我要对IL中出现的符号作一下简单解释。以点号.开头的标号为伪指示代码,

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

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

6、al”,保存局部变量。如图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)、第二个参数(j)(和局部变量不同,参数的指示下标从1开始)。它完成的操作如同 (top)=i,top=top+1,(top)=j,top=top+1,如图e。其中,“ldarg”可以理解为“load argument”,加载参数。 sub这条语句作用是将当前栈顶元素求反,再下加到第二个栈单元中,如图f。它完成的操作如同top=top-1,temp= -(top),top=top-1,(top)=(top)+ temp,top=top+1。top0toptop4toptopjitopi-j (a) (b) (c)(d) (e)(f) stloc.2这条语句作用是将当前栈顶元素存入第二个局部变量(r)。它完成的操作如同top=top-1,r stloc.y -ldloc.y -ret . 因为在以上三种情况当中,返回值都不存储在局部变量当中。http:/

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号