helloworld代码_“c#逆向工程学习之路”之hello world程序代码解释

.

  为了对ILasm有一个大体的感受,我们考虑以上这个简单的案例-Hello World!本案例是通过调用WriteLine完成的,WriteLine是Class System.Console(属于标准程序集mscorlib)中的Static Method。有关mscorlib的内容请参考ECMA335的第四部分,如果有必要,本人将会翻译这部分的内容。
  .assembly extern mscorlib {auto} 声明引用一个外部程序集-mscorlib(包含System.Console的定义).关键字auto代表自动发现被引用程序集的最新版本.

  .assembly MyApp{}声明了该程序程序集的名字为MyApp,程序集是CLI可执行内容的部署(调度)单元.

  .class public Program extends [mscorlib]System.Object定义了一个类,Program,关键字public定义了类的可见性,说明该类对当前程序集外部是可见的.与public相反的关键字是private. extends [mscorlib]System.Object定义了类Program的基类是System.Object.默认情况下,所有的类都是从Mscorlib.dll程序集中的System.Object类派生出来的.只有System.Object自身和接口没有基类

  结构(.net术语中称为值类型)是从[mscorlib]System.ValueType派生的,枚举派生于[mscorlib]System.Enum.这两种不同的类型完全是由它们所扩展的类进行确认,所以每次声明值类型或者枚举的时候,必须使用extends子句.

  .method static private void Main(string[] args): .method声明定义了一个全局方法main. void定义了方法的返回类型.

  .entrypoint将当前方法标识为该程序集的入口点,每个exe必须有单一的入口点,DLL可以没有.

  .maxstack 1定义程序至多使用一个堆栈槽.

  ldstr "Hello World!" ldstr指令将其后的字符串常量送入堆栈.

   call指令 调用了方法WriteLine(该方法尾部会将调用前堆栈顶部清除),并指定一个string类型的参数.其方法返回类型是Void.

  pop指令将堆栈顶部的数据从堆栈清除.否则到达ret时栈上还有一个项,而方法返回的是void,这将会导致异常发生.

  ret指令返回堆栈上的值,如果方法的返回类型和堆栈的类型不匹配,将会产生异常.栈上还有一个项,而方法返回的是void,也会产生异常,如果该方法需要返回值而栈却是空的,也会发生异常.

参考资料

  1. ECMA335 第108页
  2. NET探秘:MSIL权威指南 第6页
  3. 因为《NET探秘:MSIL权威指南》部分内容实在是不说人话,还没有直接读ECMA335的英文来的顺畅
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值