MSIL分析报告.docx

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MSIL 教程在网上发现了一个非常好的MSIL教程,可惜是英文版的,于是就翻译了一下,与大家共享,原文/Csharp/.NET/net_general/il/article.php/c4635,初次翻译文章,请大家指正。介绍微软中间语言 (MSIL) 是一种语言,是许多编译器(C#,VB.NET等)的输出.?ILDasm?(中间语言反汇编器)程序和.Net Framework SDK(FrameworkSDK/Bin/ildasm.exe)打包在一起,让用户以人可阅读的格式查看MSIL代码。通过该工具,我们可以打开任何.net可执行文件(exe或dll)并查看其MSIL代码。ILAsm?程序(中间语言编译器)从MSIL语言生成可执行文件。我们可以在WINNT / Microsoft.NET /Framework /vn.nn.nn目录中找到这个程序。许多Visual C++程序员开始.net开发是因为他们对.NET框架的底层发生了一些什么感兴趣。学习MSIL给了用户理解某些对C#程序员或VB.NET程序员来说是透明的东西的机会。通晓MSIL给.NET程序员更多的能力。我们从不需要直接用MSIL编写程序,但是在某些情况下是非常有用的,我们可以用ILDasm打开程序的MSIL代码,查看它到底做了一些什么。一个Doc格式的MSIL参考对.NET开发人员来说比较有用,它也许可以在Framework SDK目录下找到:FrameworkSDK/Tool Developers Guide/docs/Partition II Metadata.doc?(元数据定义和术语). 在这个文件中,我发现了所有MSIL指令的说明,例如.entrypoint,?.locals等.FrameworkSDK/Tool Developers Guide/docs/Partition III CIL.doc?(CIL命令集)包含了一个MSIL命令的完整列表。在工作中,我也用到了一个MSDN的ILDAsm教程,一篇2001年5月由John Robbins发表在MSDN杂志的优秀的文章: ILDASM is Your New Best Friend。我想学习一门语言最好的途径就是用它写一些程序,所以我决定写一些小的MSIL程序。实际上,我们有写这些代码——是C#编译器生成的,我只是做一了一些小的更改,并加了许多注释以描述MSIL是如何工作的。通过阅读附在本文的例子可以帮助.NET程序员理解中间语言,帮助其在需要的时候更易读懂MSIL代码。一般信息在MSIL中,所有的操作都在栈上完成。当调用一个函数的时候,其参数和局部变量都被分配到栈上。函数的代码从该栈开始,把一些值压入栈,对这些值进行一些操作,从栈上取出值。执行MSIL名利和函数由3个步骤完成:1.????? 把命令操作数和函数参数压入栈。2.????? 执行命令或者调用函数。命令或函数从栈中取出他们的操作数(参数)并把他们压入结果栈(返回值)。3.????? 从栈中读取结果值。步骤1~3是可选的,例如,void函数不会压入一个结果值到栈。栈包含值类型对象和引用类型对象的引用。引用类型对象本身保存在堆中。用来把一个值压入栈中的MSIL命令是ld...?(装载),用来从栈中取出值的命令是st...?(存储),因为值都存在变量中。我们可以把入栈操作叫做装载,出栈操作叫做存储。示例项目本文附上的代码中包含了许多用MSIL写的控制台程序. 如果需要编译他们,请确定ILAsm程序可以通过PATH访问。每个项目都是一个Visual Studio解决方案,IL源文件可以用VS的文本编辑器打开,Build命令运行ILAsm?程序在项目所在目录生成exe文件,run命令执行该文件。在每个程序的末尾,我加了几行代码,他们可以用C#来写:??? Console.WriteLine(Press Enter to continue);??? Console.Read();这样,当从Windows Explorer运行的时候,就可以看到程序的输出。下面是所含项目的列表:1.??????打印字符串—打印字符传到控制台。2.??????赋值—给一个int变量赋值并把它打印到控制台。3.??????运算—从控制台读取2个数字,惊醒+,-和乘的操作,并显示结果。4.??????数组— 分配一个int类型的数组,给他的元素赋值,打印其元素和数组的长度。5.??????比较— 输入2个数字并打印出最小的那个。6.??????数组2— 用循环填充数组元素并打印某些元素。7.??????不安全代码— 使用unsafe指针访问数组元素。8.??????PInvoke— 调用Win32 API。9.??????类— 和类一起工作。10.???异常— 异常处理。

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档