IL简介
.NET是什么?
- 虚拟机
- 运行库
- 支持多语言
例:hello.cs
PE文件头
元数据 ====>CLR==>machine
IL代码
MetaData
- 描述数据类型的数据
- 存在两种格式:表格/堆(用偏移量来索引)
- 两种格式都保存为STREAM
- #~
- 己压缩的metadata表
- #-
- 未压缩的metadata表
- 其它堆类型
- #strings 字符串
- #guid
- #blob
- #US
- RID & Tokens
- RID: metadata表的行号
- Tokens
- 外部统一使用的唯一标示符
- 4字节整数
- Tokens = RID(8bit) + RID type(24bit)
- RID types : 8bit
- 0x06 mdtMethodDef
- 例: 06000002,在表中的第二项,是一个方法的定义
- Coded tokens --压缩过的TOKENS,仅由内部使用。
Method #2 (06000002)
-------------------------------------------------------
MethodName: .ctor (06000002)
IL是基于栈的语言
- 栈上保存强类型的数据
- 每条指令对栈进行操作
- 例子:编写简单的代码:
Ldloc a //a Ldloc b //b Add //a + b Ldc 3 //a+b , 3 Mul //* Stloc a
- 无条件跳转
- 跳转: Br/Br.s
- 为假:BrFalse/..
- 为真: BrTrue/… S,偏移量,stort
- 有条件跳转
- 等于跳转: beq/beq
- ….
- 返回
- ret
- dup 复制
- pop 退栈
- ldc.<type> <data>加载
- Ldind.<type> <pointer>间接加载
- Stind.<type> <pointer>间接保存
- Conv.<type> 类型转换
- ldarg/ladarg.s 加载参数
- ldarga/…加载参数地址
- starg 保存至参数
- ldloc/…. 加载局部变量地址
- Stloc/.. 保存至局部变量
- Jmp<token> 跳转
- Call<token> 非虚函数调用
- Callvirt<token> 虚函数调用
- Ldftn<token> 加载函数地址
- ldvirtftn<token> 加载虚函数地址
- Calli<token>本地调用
- Tail call: Tail.前缀 函数式编程,将函数前面的内容clear
- Newojb<token> 创建对象实例
- ldstr<token> 加载
- box/unbox 装、拆箱
- lsinst<token>/castclass<token> 转换