IL指令集
来源:互联网 发布:广西广电网络企业邮箱 编辑:程序博客网 时间:2024/05/16 08:14
- IL操作指令
push axargargument参数??操作数中的数值.0?第零个参数 .1?第一个参数.2?第二个参数.3?第三个参数.s xx(short)参数xxaaddress操作数的地址只有 .s xx,参见ldarg.sloclocal局部变量参见ldargfldfield字段(类的全局变量)参见ldargxx?xx字段,eg:
ldfld xxcconst常量.i4int 4 bytesC#里面的int,其他的类型例如short需要通过conv转换.m1minus 1-1.0?0.1?1…….8 8.s(short)后面跟一个字节以内的整型数值(有符号的)??后面跟四个字节的整型数值.i8int 8 bytesC#里面的long??后面跟八个字节的整型数值.r4real 4 bytesC#里面的float??后面跟四个字节的浮点数值.r8real 8 bytesC#里面的double??后面跟八个字节的浮点数值nullnull空值(也就是0)??????ststore将操作数从堆栈中弹出,相当于:
pop axargargument参数??操作数中的数值.0?第零个参数 .1?第一个参数.2?第二个参数.3?第三个参数.s xx(short)参数xxaaddress操作数的地址只有 .s xx,参见ldarg.sloclocal局部变量参见ldargfldfield字段(类的全局变量)参见ldargxx?xx字段,eg:
ldfld xxcconst常量.i4int 4 bytesC#里面的int,其他的类型例如short需要通过conv转换.m1minus 1-1.0?0.1?1…….8 8.s(short)后面跟一个字节以内的整型数值(有符号的)??后面跟四个字节的整型数值.i8int 8 bytesC#里面的long??后面跟八个字节的整型数值.r4real 4 bytesC#里面的float??后面跟四个字节的浮点数值.r8real 8 bytesC#里面的double??后面跟八个字节的浮点数值nullnull空值(也就是0)??????convconvert数值类型转换,仅仅用纯粹的数值类型间的转换,例如int/float等???.i1int 1 bytesC#里面的sbyte???.i2int 2 bytesC#里面的short.i4int 4 bytesC#里面的int.i8int 8 bytesC#里面的long.r4real 4 bytesC#里面的float.r8real 8 bytesC#里面的double.u4uint 4 bytesC#里面的uint.u8uint 8 bytesC#里面的ulongb/brbranch条件和无条件跳转,相当于:
jmp/jxx label_jumpbr??无条件跳转?????后面跟四个字节的偏移量(有符号).s(short)后面跟一个字节的偏移量(有符号)falsefalse值为零的时候跳转???参见brtruetrue值不为零的时候跳转???beqequal to相等???nenot equal to不相等ununsigned or unordered无氟好的(对于整数)或者无序的(对于浮点)gtgreater than大于ltless than小于gegreater than or equal to大于等于leless than or equal to小于等于callcall调用?????(非虚函数)????virtvirtual虚函数
- IL详细指令
- IL实例分析
1、报警器public class Baojingqi { public string Baojing(int wendu) { return string.Format("警报:滴滴滴,现在温度{0}摄氏度", wendu); } }
构造函数.ctor.method public hidebysig specialname rtspecialname instance void .ctor() cil managed{ // 代码大小 7 (0x7) .maxstack 8 IL_0000: ldarg.0 //加载参数0,每个非static类,参数0均表示this IL_0001: call instance void [mscorlib]System.Object::.ctor() //调用object的够着函数 IL_0006: ret //返回} // end of method Baojingqi::.ctor
方法Baojing.method public hidebysig instance string Baojing(int32 wendu) cil managed{ // 代码大小 22 (0x16) .maxstack 2 .locals init ([0] string CS$1$0000) //方法中需要用到的变量(这里面的变量CS$1$0000并没有在方法中直接定义,这种变量个人称之为临时变量) IL_0000: nop IL_0001: ldstr bytearray (66 8B A5 62 1A FF F4 6E F4 6E F4 6E 0C FF B0 73 // f..b...n.n.n...s 28 57 29 6E A6 5E 7B 00 30 00 7D 00 44 64 0F 6C // (W)n.^{.0.}.Dd.l A6 5E ) // .^<span style="white-space:pre"></span>//加载字符串 IL_0006: ldarg.1 //加载参数1,即wendu,那我的参数0去哪里了?这里上面说过非static类参数0位this,故其他参数从1开始计 IL_0007: box [mscorlib]System.Int32 //装箱,因为String.Format的2个参数是string和object类型的,int转object为装箱操作 IL_000c: call string [mscorlib]System.String::Format(string,object) //调用String.Format方法 IL_0011: stloc.0 //将调用的方法返回值存储局部变量0中,这里就是上述所说的临时变量 IL_0012: br.s IL_0014 //跳转 IL_0014: ldloc.0 //加载局部变量0 IL_0015: ret<span style="white-space:pre"></span> //返回} // end of method Baojingqi::Baojing
2、显示器IL同上
3、加热器public class Jiareqi { public int Wendu; public delegate string ShowDelegate(int wendu); public ShowDelegate MyDelegate; public event ShowDelegate BoilEvent; public void Jiare() { for (int i = 0; i < 100; i++) { Wendu = i; if (i > 96) { BoilEvent(i); } } } }
方法Jiare.method public hidebysig instance void Jiare() cil managed{ // 代码大小 55 (0x37) .maxstack 2 .locals init ([0] int32 i, [1] bool CS$4$0000) IL_0000: nop IL_0001: ldc.i4.0 //加载常量0 IL_0002: stloc.0 //存储变量0,即i IL_0003: br.s IL_002d //跳转 IL_0005: nop IL_0006: ldarg.0 //加载参数0,this IL_0007: ldloc.0 //加载变量0,i IL_0008: stfld int32 ReShuiQi.Jiareqi::Wendu //存储字段,Wendu = i IL_000d: ldloc.0<span style="white-space:pre"></span> //加载变量0,i IL_000e: ldc.i4.s 96 //加载常量96 IL_0010: cgt //如果变量0 > 常量96,则为1,反之为0 IL_0012: ldc.i4.0 //加载常量0 IL_0013: ceq<span style="white-space:pre"></span> //比较前2个值是否相等,相等为1,反之为0 IL_0015: stloc.1 //将上述值存到本地变量1中 IL_0016: ldloc.1 //加载本地变量1 IL_0017: brtrue.s IL_0028 //如果为true,则跳转,即不执行if中的语句 IL_0019: nop IL_001a: ldarg.0 //加载参数0,this IL_001b: ldfld class ReShuiQi.Jiareqi/ShowDelegate ReShuiQi.Jiareqi::BoilEvent //加载字段BoilEvent,与上一句结合理解为this.BoilEvent,在编码过程中当字段前面不加this时,编译会自动添加 IL_0020: ldloc.0 //加载变量0,i IL_0021: callvirt instance string ReShuiQi.Jiareqi/ShowDelegate::Invoke(int32) //调用方法Invoke IL_0026: pop //移除当前位于计算堆栈顶部的值 IL_0027: nop IL_0028: nop IL_0029: ldloc.0 //加载局部变量0,i IL_002a: ldc.i4.1 //加载常量1 IL_002b: add //上述2个值相加 IL_002c: stloc.0 //将值存储到局部变量0中,i IL_002d: ldloc.0 //加载局部变量0,i IL_002e: ldc.i4.s 100 //加载常量100 IL_0030: clt //如果局部变量0<100,则为1,反之为0 IL_0032: stloc.1 //将上述比较结果存储到局部变量1中 IL_0033: ldloc.1 //加载局部变量1 IL_0034: brtrue.s IL_0005 //判断是否为true,跳转 IL_0036: ret} // end of method Jiareqi::Jiare
1 0
- IL指令集
- IL指令集
- IL指令集
- IL指令
- IL指令
- IL指令
- IL指令
- c#的逆向工程-IL指令集
- 常用IL指令介绍
- C# IL 指令
- IL指令详细
- IL指令大全
- IL指令大全
- IL常见指令
- IL指令详细
- IL 常用指令
- IL指令详细表
- IL指令速查
- java中StringBuilder、StringBuffer、String类之间的关系
- Java Web文件下载1——文件下载实现和乱码处理(转载)
- 15OJ——爱你多少年呢
- Labeling Balls POJ3687 【拓扑排序反向建边】【邻接表】
- xmpp相关资料链接
- IL指令集
- 【grub默认启动项修改方式】亲测可用
- 读取Wave格式语音头信息的实现
- Guava学习笔记:EventBus
- Flex简单小程序
- WPF控件简介
- c#通过app.manifest使程序以管理员身份运行
- Spring Mvc集合的传值
- 转:Spring使用静态工厂方法创建Bean