MSIL 教程(三):类和异常处理(转)
转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857771.html
续上文【翻译】MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API ,本文继续讲解类和异常处理。谨以这三篇译文纪念29年前的今日,那个让母亲今生难以忘记的幸福而又痛苦的日子。
类
在前面的程序中,我们在Main函数中调用类函数,在本程序中,我们将徐希如何定义类。本程序包含2个类: Class1和SampleClass,Class1带有函数Main,在Main中生成SampleClass的一个实例。
指令:
- .field—定义类成员。和关键字public、private、static等一起使用。
命令:
- stsfld static field—用堆栈中的值替换静态字段的值。
- ldfld field—把一个非静态字段装入堆栈。类实例的地址必须在调用本命令之前装入堆栈。
- ldarg.n—把第n个参数装入堆栈。在非静态函数中,第0个参数是一个隐含的参数,代表this。
- newobj constructor—用构造函数constructor生成一个类的实例。构造函数的参数必须在调用本函数之前先装入堆栈。一个类的实例会被生成并装入堆栈。
- callvirt instance function—调用一个对象的后期绑定方法。
代码:
.assembly Classes {}
/*
class SampleClass
{
private int m_n;
private string m_s;
public static int nStatic = 10;
public SampleClass(int n, string s)
{
m_n = n;
m_s = s;
} public int Number
{
get
{
return m_n;
}
} public string String
{
get
{
return m_s;
}
}
}; class Class1
{
[STAThread]
static void Main(string[] args)
{
SampleClass o = new SampleClass(1, "Sample");
Console.WriteLine(SampleClass.nStatic.ToString());
Console.WriteLine(o.Number.ToString());
Console.WriteLine(o.String);
}
}
*/ .class private auto ansi beforefieldinit SampleClass
extends [mscorlib]System.Object
{
.field private int32 m_n // private int m_n;
.field private string m_s // private string m_s;
.field public static int32 nStatic // public static int nStatic; // 该私有静态构造函数由编译器生成
// (用以初始化类的静态成员)
.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
.maxstack // *************************************************
// nStatic = 10
// *************************************************
ldc.i4.s // 把常量装入堆栈
// stsfld 命令把静态字段的值替换成堆栈中的值
stsfld int32 SampleClass::nStatic ret
} // 构造函数
// public SampleClass(int n, string s)
//
.method public hidebysig specialname rtspecialname
instance void .ctor(int32 n, string s) cil managed
{
.maxstack // *************************************************
// 调用基类的构造函数
// *************************************************
ldarg. // 把第0个参数装入堆栈(隐含指针this)
// 调用类Object的构造函数
call instance void [mscorlib]System.Object::.ctor() // *************************************************
// m_n = n
// *************************************************
ldarg. // 把第0个参数装入堆栈(隐含指针this)
ldarg. // 把第1个参数装入堆栈(n)
// 把n的值存入this.m_n
stfld int32 SampleClass::m_n // *************************************************
// m_s = s
// *************************************************
ldarg. //把第0个参数装入堆栈(隐含指针this)
ldarg. //把第2个参数装入堆栈(s)
// 把s的值存入this.m_s
stfld string SampleClass::m_s ret
} // 数字型属性
.property instance int32 Number()
{
// 调用 get_Number
.get instance int32 SampleClass::get_Number()
} .method public hidebysig specialname instance int32
get_Number() cil managed
{
.maxstack // 由编译器生成的变量
// 译注:实际上,只有Debug版的才有,Release版的就直接返回m_n
.locals ([] int32 tmp) // *************************************************
// 返回 m_n;
// *************************************************
ldarg.
// 装入第0个参数(this)
ldfld int32 SampleClass::m_n
// 装入由堆栈栈顶指针指向的对象的字段
stloc.
// 存入第0个变量
ldloc.
// 把第0个变量装入堆栈(函数的返回值)
ret
} // 字符型属性
.property instance string String()
{
.get instance string SampleClass::get_String()
} .method public hidebysig specialname instance string
get_String() cil managed
{
.maxstack // 由编译器生成的变量
.locals ([] string tmp) ldarg.
// 装入第0个参数(this)
ldfld string SampleClass::m_s
// 装入由堆栈栈顶指针指向的对象的字段
stloc.
// 存入第0个变量
ldloc.
// 把第0个变量装入堆栈(函数的返回值)
ret
}
} .class private auto ansi beforefieldinit Class1
extends [mscorlib]System.Object
{
// public的缺省构造函数
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
.maxstack // *************************************************
// 调用基类构造函数
// *************************************************
ldarg.
// 装入thisr
call instance void [mscorlib]System.Object::.ctor()
// 类Objectr的构造函数 ret
} // Main 函数
.method private hidebysig static void Main(string[] args)
cil managed
{
// 本方法为程序的入口点
.entrypoint // 自定义属性
.custom instance void [mscorlib]System.
STAThreadAttribute::.ctor() = ( ) .maxstack .locals ([] class SampleClass o,
[] int32 tmp) // 由编译器生成 // *************************************************
// o = new SampleClass(1, "Sample");
// *************************************************
ldc.i4. // 把常量1装入堆栈
ldstr "Sample" // 把字符常量装入堆栈
// 通过传入堆栈中的2个参数生成一个SampleClass的对象,
// 并把他装入堆栈
newobj instance void SampleClass::.ctor(int32, string)
stloc. // 存入第0个变量 // *************************************************
// 访问静态类成员
// Console.WriteLine(SampleClass.nStatic.ToString());
// ************************************************* //把静态字段的地址装入堆栈
ldsflda int32 SampleClass::nStatic
// 为堆栈中的对象调用Int32::ToString
call instance string [mscorlib]System.Int32
::ToString()
// 调用静态的WriteLine,其传入参数是堆栈中的字符串
call void [mscorlib]System.Console
::WriteLine(string) // *************************************************
// 调用实例函数
// Console.WriteLine(o.Number.ToString());
// *************************************************
ldloc. // 装入第0个变量
// 调用堆栈中对象的函数
call instance int32 SampleClass::get_Number()
stloc. // 存入第1个变量
ldloca.s tmp // 把地址装入堆栈
call instance string [mscorlib]System.Int32
::ToString()
call void [mscorlib]System.Console
::WriteLine(string) // *************************************************
// 调用实例函数
// Console.WriteLine(o.String);
// *************************************************
ldloc.
callvirt instance string SampleClass::get_String()
call void [mscorlib]System.Console
::WriteLine(string) // *************************************************
ldstr "Press Enter to continue"
call void [mscorlib]System.Console
::WriteLine(class System.String)
call int32 [mscorlib]System.Console::Read()
pop
// ************************************************* ret
}
}
异常处理
本程序使2个数相除,捕捉其除0异常。try/catch 块在MSIL中看起来像C#中的一样。
命令:
- leave.s label—离开try/catch等保护块。
代码:
.assembly Exception {} /*
int x, y, z;
string s; Console.WriteLine("Enter x:");
s = Console.ReadLine();
x = Int32.Parse(s); Console.WriteLine("Enter y:");
s = Console.ReadLine();
y = Int32.Parse(s); try
{
z = x / y; Console.WriteLine(z.ToString());
}
catch (Exception e)
{
Console.WriteLine(e.Message);
} */ .method static public void main() il managed
{
.entrypoint
.maxstack .locals ([] int32 x,
[] int32 y,
[] int32 z,
[] string s,
[] class [mscorlib]System.Exception e) //输入 x, y ... .try
{
// *************************************************
// z = x / y;
// *************************************************
ldloc. // 装入第0个变量
ldloc. // 装入第1个变量
div // 相除
stloc. // 把结果存入第2个变量 // *************************************************
// Console.WriteLine(z.ToString());
// *************************************************
ldloca.s z // 装入z的地址
call instance string [mscorlib]System.Int32
::ToString()
call void [mscorlib]System.Console
::WriteLine(string) leave.s END_TRY_CATCH // 退出try
}
catch [mscorlib]System.Exception
{
stloc.s e // 存入由堆栈抛出的异常 // *************************************************
// Console.WriteLine(e.Message);
// *************************************************
ldloc.s e // load e
callvirt instance string [mscorlib]System.Exception
::get_Message()
call void [mscorlib]System.Console
::WriteLine(string)
leave.s END_TRY_CATCH // 退出catch块
} END_TRY_CATCH: ret
}
MSIL 教程(三):类和异常处理(转)的更多相关文章
- struts2官方 中文教程 系列八:异常处理
在本教程中,我们将探讨如何启用Struts 2框架处理web应用程序生成的任何未捕获的异常.Struts 2提供了健壮的异常处理,包括能够自动记录任何未捕获的异常,并将用户重定向到错误web页面. 贴 ...
- CocoStudio教程三:认识并利用CocoStudio的果实 运行2.2.1版本
原文:CocoStudio教程三:认识并利用CocoStudio的果实 原文用的老版,用2.21搞起来好像有些问题,然后自己摸索了下,有的都是乱找的方法,只求能运行... 1,原文的CCJsonRea ...
- MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)
转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...
- Android Studio系列教程三--快捷键
Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...
- Quartz教程三:Job与JobDetail介绍
Quartz教程三:Job与JobDetail介绍 原文链接 | 译文链接 | 翻译:nkcoder | 校对: 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感 ...
- springboot-web进阶(三)——统一异常处理
补充 springboot中也是一样的可以对结果进行统一格式的包装,这样也就方便了前台的统一接收处理了: 1.结果集包装类 package com.example.demo.bean; /** * 结 ...
- PySide——Python图形化界面入门教程(三)
PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...
随机推荐
- 深入浅出OOP(四): 多态和继承(抽象类)
在本文中,我们讨论OOP中的热点之一:抽象类.抽象类在各个编程语言中概念是一致的,但是C#稍微有些不一样.本文中我们会通过代码来实现抽象类,并一一进行解析. Abstract Classes 在微软的 ...
- mybatis框架demo first
SqlMapConfig.xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE con ...
- Jstat在分析java的内存GC时的应用
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量.使用时,需加上查看进程的进程id,和所选参数. 执行:cd $JAVA_HOME/bin中执行jstat,注意j ...
- iOS开发-UIScrollView原理
UIScrollView在开发中是不可避免,关于UIScrollView都有自己一定的理解.滚动视图有两个需要理解的属性,frame和bounds,frame是定义了视图在窗口的大小和位置,bound ...
- phpstorm的安装和破解
1.什么是phpstorm? PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查.但是phpstorm是商业软件, ...
- OpenGL学习进程(12)第九课:矩阵乘法实现3D变换
本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈. (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ...
- Spring第一天
Spring框架 1.1:了解Spring Spring的核心是提供了一个容器,主要通过 BeanFactory(接口)来创建和管理对象,一般我们用它的子类ApplicationContext 来创建 ...
- Leetcode-462 Minimum Moves to Equal Array Elements II
#462. Minimum Moves to Equal Array Elements II Given a non-empty integer array, find the minimum n ...
- GO語言基礎教程:Hello world!
首先簡單地說一下GO語言的環境安裝,從 http://golang.org/dl/ 針對自己的操作系統選擇合適的安裝包,然後下載安裝即可,下載的時候注意別選錯了的操作系統,例如go1.3.1.darw ...
- windows下clang的安装与使用
我本意是想在windows下学习下C++11,而结果是我的Visual Studio 2012不完全支持,而我又懒得去安装2013/2015,太大了.公司运维也不允许我去下载- -,然后就想能不能在w ...