IL代码底层运行机制

上传人:人*** 文档编号:431319251 上传时间:2023-06-26 格式:DOCX 页数:6 大小:21.63KB
返回 下载 相关 举报
IL代码底层运行机制_第1页
第1页 / 共6页
IL代码底层运行机制_第2页
第2页 / 共6页
IL代码底层运行机制_第3页
第3页 / 共6页
IL代码底层运行机制_第4页
第4页 / 共6页
IL代码底层运行机制_第5页
第5页 / 共6页
点击查看更多>>
资源描述

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

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

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

3、in t32 V_0, in t32 V_1, int 32 V_2, in t32 V_3)ldc.i4.0stloc.1ldci44stloc.2ldarg 1stl oc.0ldarg.1ldarg .2substloc.2ldloc.2ldloc.0ldloc.1addaddstloc.2ldloc .2stl oc.3br .sIL 0014ldloc.3retIL代码也可以由VS.NET自带的IL编译工具订asm编译为.dll装配件或.exe可执行文件。这里,我要对IL中出现的符号作一下简单解释。以点号开头的标号为伪指示代码,只起指 示作用,最终不会被JIT编译为本地可执行代码,如

4、“.me thod ”,“.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、V_2和我们在CS源程序中定义的局部变

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

6、图b,它完成的操作如同top=top-1, s=(top)。ldc.i4.4这条语句完成的操作如同(top)=4,top=top+1,如图c。stl oc.2这条语句完成的操作如同t op=top-1,t=( top),如图doldarg.1ldarg.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。top0toptop4(a)(b)(c)(d)(e)(f)stl oc.2这条语句作用是将当前栈顶元素存入第二个局部变量(r)。它完成的操作如同top=top-1, r st loc.y -ldloc.y -ret .因为在以 上三种情况当中,返回值都不存储在局部变量当中。http:/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

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