<私の別ブログ 2014年03月17日 からの引っ越し記事です>
ILDASM.exeを使用すると、C#で作成したexeファイルを逆アセンブルしてニーモニックを確認できる。組込み系ソフト技術者としては、こういうのを見ると、なんだかワクワクします(笑)。
使用方法
Microsoft Windows SDKをインストール(自分の開発環境に対応するSDKを選択する必要あり?)。その中に含まれているILDASM.exeで、C#により作成したexeファイルを開く。
※パスは C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\ILDASM.exe など
使用例
たとえば、下記のサンプルソース。
// 文字列のリスト
List m_List = new List();
// ボタン押下時処理
private void button1_Click(object sender, EventArgs e)
{
// 文字列
string input = "abc,def,ghi,jkl,mno,pqr,stu,vwx,yz";
// カンマで分割
string[] array = input.Split(',');
// 分割した結果をリストに登録
foreach (string elem in array)
{
m_List.Add(elem);
}
}
上記をビルドして作成したexeを、ILDASM.exeで解析すると、以下のようなニーモニックが見れる。
.method private hidebysig instance void button1_Click(object sender,
class [mscorlib]System.EventArgs e) cil managed
{
// Code size 67 (0x43)
.maxstack 4
.locals init ([0] string input,
[1] string[] 'array',
[2] string elem,
[3] char[] CS$0$0000,
[4] string[] CS$6$0001,
[5] int32 CS$7$0002)
IL_0000: ldstr "abc,def,ghi,jkl,mno,pqr,stu,vwx,yz"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ldc.i4.1
IL_0008: newarr [mscorlib]System.Char
IL_000d: stloc.3
IL_000e: ldloc.3
IL_000f: ldc.i4.0
IL_0010: ldc.i4.s 44
IL_0012: stelem.i2
IL_0013: ldloc.3
IL_0014: callvirt instance string[] [mscorlib]System.String::Split(char[])
IL_0019: stloc.1
IL_001a: ldloc.1
IL_001b: stloc.s CS$6$0001
IL_001d: ldc.i4.0
IL_001e: stloc.s CS$7$0002
IL_0020: br.s IL_003a
IL_0022: ldloc.s CS$6$0001
IL_0024: ldloc.s CS$7$0002
IL_0026: ldelem.ref
IL_0027: stloc.2
IL_0028: ldarg.0
IL_0029: ldfld class [mscorlib]System.Collections.Generic.List`1 WindowsFormsApplication1.Form1::m_List
IL_002e: ldloc.2
IL_002f: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0)
IL_0034: ldloc.s CS$7$0002
IL_0036: ldc.i4.1
IL_0037: add
IL_0038: stloc.s CS$7$0002
IL_003a: ldloc.s CS$7$0002
IL_003c: ldloc.s CS$6$0001
IL_003e: ldlen
IL_003f: conv.i4
IL_0040: blt.s IL_0022
IL_0042: ret
} // end of method Form1::button1_Click
ただし、MSILの命令セットの情報が見つからないので、今後調査を継続したい。
参考情報
ILDASM.exeはMicrosoft Windows SDKに含まれており、下記から取得可能です。
Microsoft Windows SDK for Windows 7 and .NET Framework 4