日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IL 汇编学习笔记(三)

發布時間:2025/5/22 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IL 汇编学习笔记(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文:http://www.codeproject.com/dotnet/ilassembly.asp

創建和使用類對象


首先我們定義一個簡單的類,它只包含一個方法用于計算一個整數的平方(square),代碼如下:

.assembly?extern?mscorlib?{}
.assembly?MathLib
{
????.ver?
1:0:1:0
}

.module?MathLib.dll

.
namespace?HangamaHouse
{????
????.
class?public?ansi?auto?MathClass?extends?[mscorlib]System.Object
????{????????
????????.method?
public?int32?GetSquare(int32)?cil?managed
????????{
????????????.maxstack?
3
????????????ldarg.
0???//?加載對象的?this?指針到堆棧上
????????????ldarg.1???//?實例方法的實際的參數索引總是從?1?開始
????????????ldarg.1
????????????mul
????????????ret????????
????????}
????}
}

然后用命令 ILAsm MathLib.il /dll 編譯為一個 DLL.

調用的范例如下,這里創建了第一個 dll 里面的類對象,并調用其方法。

.assembly?extern?mscorlib?{}
.assembly?
extern?MathLib?{.ver?1:0:1:0}
//
//rest?code?here
//
.method?static?void????Main()?cil?managed
{
????.maxstack?
2
????.entrypoint
????.locals?init?(valuetype?[MathLib]HangamaHouse.MathClass?mclass)
????????????
????ldloca?mclass??
//?加載對象地址
????ldc.i4?5???????//?方法的參數
????call?instance?int32?[MathLib]HangamaHouse.MathClass::GetSquare(int32)
????ldstr?
"The?Square?of?5?Returned?:?"
????call?
void?[mscorlib]System.Console::Write(string)
????call?
void?[mscorlib]System.Console::WriteLine(int32)

????ret
}

構造器和屬性

構造器是這樣定義的:

.class?public?MathClass?extends?[mscorlib]System.ValueType
{
????.field?
private?int32?mValue
????
//?其他代碼。。

????.method?
public?specialname?rtspecialname?instance?void?.ctor()?cil?managed
????{
????????ldarg.
0?//?加載?this?指針
????????ldc.i4.s?15
????????stfld?int32?HangamaHouse.MathClass::mValue?
//?保存到字段
????????ret
????}
????
//?其他代碼。。
可以看到,構造器實際上是一個叫做 .ctor 的特殊方法。以上代碼中使用 specialname 和 rtspecialname 來標注它是一個特殊名稱的方法。

在 IL 中,構造器是不會自動被調用的,你必須手工去調用它。下面是一個例子:

.method?public?static?void?Main()?cil?managed
{
????.maxstack?
2
????.entrypoint
????.locals?init?(valuetype?[MathLib]HangamaHouse.MathClass?mclass)

????ldloca?mclass
????call?instance?
void?[MathLib]HangamaHouse.MathClass::.ctor()

屬性的實現跟構造器類似,實際上也是方法。代碼如下:

.method??specialname?public?instance?int32?get_Value()?cil?managed
{
????ldarg.
0
????ldfld?int32?HangamaHouse.MathClass::mValue
????ret
}
.method?specialname?
public?instance?void?set_Value(int32?)?cil?managed
{
????ldarg.
0
????ldarg.
1
????stfld?int32?HangamaHouse.MathClass::mValue
???
????ret
}???????
//Define?the?property,?Value
.property?int32?Value()
{
????.
get?instance?int32?get_Value()
????.
set?instance?void?set_Value(int32?)
}


使用屬性其實就是調用以上代碼中的 get_Value 和 set_Value 這兩個方法:

.maxstack?2?.locals
init?(valuetype?[MathLib]HangamaHouse.MathClass?tclass)

ldloca?tclass
ldc.i4?
25
call?instance?
void?[MathLib]HangamaHouse.MathClass::set_Value(int32)
ldloca?tclass
call?instance?int32?[MathLib]HangamaHouse.MathClass::get_Value()
ldstr?
"Propert?Value?Set?to?:?"
call?
void?[mscorlib]System.Console::Write(string)
call?
void?[mscorlib]System.Console::WriteLine(int32)

(To be continued)

總結

以上是生活随笔為你收集整理的IL 汇编学习笔记(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。