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,在表中的第二项,是一个方法的定义
      • Method #2 (06000002)
            -------------------------------------------------------
                MethodName: .ctor (06000002)

  • Coded tokens --压缩过的TOKENS,仅由内部使用。

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> 转换
posted @ 2009-09-22 16:50  refeiner  阅读(602)  评论(0编辑  收藏  举报