在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表示从方法中返回。
循环
循环 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: }