IL 基础学习

常用IL指令

为了今后分析IL代码。先把一个最最常用的指的功能列出来一下:

ldstr

功能:将对字符串的对象引用推送到堆栈上,ldstr 指令推送对表示在元数据中存储特定字符串新字符串对象对象引用(O 类型)。ldstr 指令分配必需的内存量并执行将字符串从在文件中使用的形式转换为在运行时要求的字符串格式所需的任何格式转换。

搞个示例:Console.WriteLine("Hi Flashccie");

ldstr "Hi Flashccie"
call void [mscorlib]System.Console::WriteLine(string)
ret

ldc.i4 num,,,,idc.i4.0,,,,idc.i4.1................

功能:将值 num 推送到堆栈上,对于整数 -128 到 127 有特殊的简短编码(并因此更有效),对于整数 -1 到 8 尤其有特殊的简短编码。所有简短编码都将 4 字节整数推送到堆栈上。如:ldc.i4.0 ,ldc.i4.1,.....等

较长的编码用于 8 字节整数以及 4 和 8 字节浮点数,并且用于不适合短格式的 4 字节值。有三种方法可以将 8 字节整数常数推送到堆栈上

1. 使用 ldc.i8指令用于必须以超过 32 位表示的常数。

2. 使用 idc.i4 指令(后跟 conv.i8)用于需要 9 到 32 位的常数。

3. 使用短格式指令(后跟 conv.i8)用于可以 8 位或更少位表示的常数。

 

stloc index

功能:从堆栈中弹出值并将其放在局部变量 index 中。(index最大:65534,从0开始)

stloc 指令从计算堆栈中弹出位于顶部的值并将其移动到局部变量号 index 中,其中局部变量从 0 向上进行编号。值的类型必须与当前方法的本地签名所指定的局部变量的类型匹配。

在将值保存到只能容纳长度小于 4 个字节的整数值的局部变量中时,会在将该值从堆栈移动到局部变量中时将其截断。将浮点值从其本机大小(F 类型)舍入到与该参数关联的大小。

怎么理解呢?

比如你在一个方法中定义下以下几个变量:

int i;
int i0=new Int();
哪么就会生成以下IL代码:

    .locals init (
        [0] int32 num,
        [1] int32 num2)

L_0000: nop
   
//初始化i0为0
L_0001: ldc.i4.0 //将0推上栈顶
L_0002: stloc.1 //从堆栈顶部弹出一个值到索引号为1的变量中去

 

posted on 2008-10-09 14:25  zamesking  阅读(1077)  评论(0编辑  收藏  举报

导航