IL汇编语言介绍

在IL汇编语言中,任何语句都是以一个点号(.)开始的,以此告诉编译器这是一种特殊的指令。

.assembly 指令告诉编译器,我们准备去用一个外部的类库(不是我们自己写的,而是提前编译好的)

.entrypoint 指令告诉编译器去把这个函数标记为整个应用程序的入口点(Entry Point ),也就是执行这个应用程序时最先执行的函数。

.locals 定义了局部变量

.method 标记告诉编译器我们准备定义一个方法

.maxstack number 它告诉编译器我们要加载到内存(实际是评估堆栈)中去的项的最大数目

 

 
ld == load   st == set   ret == return  arg == argument  
beq (==), bne(!= ),bge (>= ),bgt(>), ble (<= ), blt(<) ,还有brfalse (如果栈顶的元素是0),brtrue(如果栈顶的元素非0).
stloc.index 把栈顶元素赋值给locals[index]   

ldstr指令是用来把一个字符串加载到内存或评估堆栈中

cil managed 指令告诉编译器,把这段代码当作托管代码进行编译。

ret表示从方法中返回。

201108081203236087

循环

循环
1: .method static void main() cil managed 
   2:  
   3:    //Define two local
   4:    variables .locals init (int32, int32)
   5:    .maxstack 2
   6:    .entrypoint    
   7:    ldc.i4 4
   8:  
   9:    stloc.0        //Upper    limit of the Loop, total 5 
  10:    ldc.i4 0 
  11:    stloc.1        //Initialize the Starting of loop 
  12:  
  13: Start:     
  14:    //Check if the Counter exceeds
  15:    ldloc.1 
  16:    ldloc.0 
  17:    bgt Exit //If Second variable exceeds the first variable, then exit
  18:    
  19:    ldloc.1
  20:    call void [mscorlib]System.Console::WriteLine(int32)
  21:    
  22:    //Increase the Counter
  23:    ldc.i4 1
  24:    ldloc.1
  25:    add
  26:    stloc.1
  27:    br Start
  28: Exit:    
  29:    ret
等同与
循环
  1: for (temp=0; temp <5; temp++)
   2:             System.Console.WriteLine (temp)

定义方法

IL汇编语言中创建方法与C#和C++中创建函数基本一样,只是有一点点改变。

定义方法
   1: //Methods.il
   2: //Creating Methods
   3:  
   4: .assembly extern mscorlib {}
   5:  
   6: .assembly Methods
   7: {
   8:     .ver 1:0:1:0
   9: }
  10: .module Methods.exe
  11:  
  12: .method static void main() cil managed
  13: {
  14:     .maxstack 2
  15:     .entrypoint
  16:     
  17:     ldc.i4 10
  18:     ldc.i4 20
  19:     call int32 DoSum(int32, int32)
  20:     call void PrintSum(int32)
  21:     ret
  22: }
  23:  
  24: .method public static int32 DoSum (int32 , int32 ) cil managed
  25: {
  26:     .maxstack 2    
  27:     
  28:     ldarg.0
  29:     ldarg.1
  30:     add
  31:     
  32:     ret
  33: }
  34: .method public static void PrintSum(int32) cil managed
  35: {
  36:     .maxstack 2
  37:     ldstr "The Result is : "
  38:     call void [mscorlib]System.Console::Write(string)
  39:     
  40:     ldarg.0
  41:     call void [mscorlib]System.Console::Write(int32)
  42:     
  43:     ret
  44: }

等同于

定义方法
 public static void Main(string[] args)
        {
            PrintSum(DosSum(10, 20));
        }

        public static int DoSum(int n1, int n2)
        {
            return n1 + n2;
        }

        public static void PrintSum(int n)
        {
            Console.WriteLine(n);
        }
创建命名空间和类

就像其它任何高级语言一样,在IL汇编语言中创建自己的类以及命名空间是非常容易的。

定义类
.assembly extern mscorlib {}
   2: .assembly MathLib
   3: {
   4:     .ver 1:0:1:0
   5: }
   6:  
   7: .module MathLib.dll
   8:  
   9: .namespace HangamaHouse
  10: {    
  11:     .class public ansi auto MathClass extends [mscorlib]System.Object
  12:     {
  13:         
  14:         .method public int32 GetSquare(int32) cil managed
  15:         {
  16:             .maxstack 3
  17:             ldarg.0        //Load the Object's 'this' pointer on the stack
  18:             ldarg.1
  19:             ldarg.1
  20:             mul
  21:             ret        
  22:  
  23:         }
  24:     }
  25: }
使用它
   1: .assembly extern mscorlib {}
   2: .assembly extern MathLib {.ver 1:0:1:0}
   3: //
   4: //rest code here
   5: //
   6: .method static void    Main() cil managed
   7: {
   8:     .maxstack 2
   9:     .entrypoint
  10:     .locals init (valuetype [MathLib]HangamaHouse.MathClass mclass) 
  11:             
  12:     ldloca mclass
  13:     ldc.i4 5
  14:     call instance int32 [MathLib]HangamaHouse.MathClass::GetSquare(int32)
  15:     ldstr "The Square of 5 Returned : "
  16:     call void [mscorlib]System.Console::Write(string)
  17:     call void [mscorlib]System.Console::WriteLine(int32)
  18:  
  19:     ret
  20: }

转载于:https://www.cnblogs.com/zhangyang94s/archive/2013/01/13/2858676.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值