IL语言(也称为公共中间语言CIL,或微软中间语言MSIL)是.NET的核心,以.NET Framework平台运行的程序最终都是由IL代码实现。也可以这样理解,无论C/C++、BASIC、Pascal等语言特征如何,在INTEL芯片上最终执行的都是Intel汇编指令集。了解IL相关知识能够以较高层次理解.NET工作原理,最大程度利用.NET Framework进行高级程序开发。
1、能更好地理解托管代码内部运行机制,研究编译器生成的IL代码可以获得文档中没有涉及到的信息。
2、查看IL代码可以帮助调试或设计代码,以便于进行性能优化,理解各种常用语言所具有的优势。
3、直接采用IL语言编程有助于实现用其他语言无法实现的IL特性。
4、编写开发工具,如编译器或调试器,理解IL则是一个先决条件。
学习IL语言,首先需要学会使用两个工具,分别为ilasm.exe(MSIL 反汇编程序)和ildasm.exe(MSIL 反汇编程序)。通过该工具,我们可以打开任何.net可执行文件(exe或dll)并查看其MSIL代码。
ilasm是命令行程序,在/%System%/ Microsoft.NET /Framework /vn.nn.nn目录下。
ilasm [options] filename [[options]filename...]
ildasm是图形程序,在/FrameworkSDK/vn.n/Bin/目录下。
符号 |
含义 |
|
更多信息 |
|
命名空间 |
|
类 |
|
接口 |
|
值类 |
|
枚举 |
|
方法 |
|
静态方法 |
|
字段 |
|
静态字段 |
|
事件 |
|
属性 |
|
清单或类信息项 |
Hello World程序是学习一门语言所接触的第一个程序,为了更好介绍IL语言格式,我根据Helloworld.il纯文本和ildasm反编译IL码解释IL语言。
//////////////////////////////////////////////////////////////////////////////////////////
// Microsoft (R) .NET Framework IL Disassembler. Version 1.1.4322.573
// Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
// PE Header:
// Subsystem: 00000003
// Native entry point address: 0000225e
// Image base: 00400000
// Section alignment: 00002000
// File alignment: 00000200
// Stack reserve size: 00100000
// Stack commit size: 00001000
// Directories: 00000010
//HelloWorld.il
//This is our first IL Program
// 支持用//语法表示单行注释,用/* ...*/表示多行或部分注释
.assembly extern mscorlib{} //指示此程序集代码引用的其他程序集。可以拥有多个extern指令。
.assembly HelloWorld //指示汇编程序插入一个程序集清单
{
.ver 1:0:1:0 //程序集版本号。可以在花括号{}中包含其他信息(如公钥或程序集版本号)
}
.module HelloWorld.exe //该指令声明一个模块,并指出存储该模块的文件名称
// MVID: {FC444559-FB26-4E01-88E6-BE721E6DFC5E} Mvid是一个GUID表示此Module,其它域保留
.imagebase 0x00400000 //为影像基地址
.subsystem 0x00000003 //连接系统类型,0x00000003表示从控制台运行
.file alignment 512 //文件对齐数值
.corflags 0x00000001 //指令设置运行库头文件标志.默认情况下,.corflags 指令指定值 1
// Image base: 0x07560000
.method static void Main() cil managed
{
.entrypoint // 该指令定义程序的入口
// 方法在 RVA 0x2050 处开始
// 代码大小 11 (0xb)
.maxstack 1 //指出方法的计算栈需要多大空间
IL_0000: ldstr "Hello , World !" //把字符串压入堆栈中
//调用静态System.Console.WriteLine方法
//方法参数引用栈顶元素,栈顶元素从栈中弹出。栈为空。
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
//从方法中返回,如栈顶为空则返回空,否则返回栈顶元素
IL_000a: ret
}
///////////////////////////////////////////////////////////////////////////////////////
好累,终于写出第一节了,明天继续....