4

以下のMSILコードをご覧ください。

IL_00:  ldstr      "Hello World"
IL_05:  call       void [mscorlib]System.Console::WriteLine(string)
IL_10:  ret

IL_00、IL_05、IL_10とはどういう意味ですか?大学でオペレーティングシステムの概念を読んだので、Windowsオペレーティングシステムがプロセスに仮想メモリを割り当てる方法を当時理解していました。上記の場合、理由もわかりません。アドレスは5ずつ増加します。

マネージコードは、VB.NETアプリケーションから生成されました。

私はこれをグーグルで検索することに時間を費やし、MSDNのいくつかの記事を読みました。私はまだはっきりしていないので、質問の理由がわかりません。

4

1 に答える 1

6

これらは、IL逆アセンブラによって生成された偽の「アドレス」です。LDSTRオペコードには、オペコードに1バイト、0x72、およびオペランドに4バイトが必要です。これは、文字列リテラルを格納するメタデータテーブルから文字列を選択するトークン値です。したがって、次のILオペコードはオフセット5から始まります。同じレシピで、CALLはオペコードに1バイト、0x28、オペランドに4バイト(メソッドトークン)を必要とします。したがって、次のILオペコードはオフセット10から始まります。RETには1バイト、0x2Aが必要であり、オペランドはありません。合計ILコードサイズは11バイトです。

逆アセンブラはこれらの「アドレス」を生成して、分岐命令のターゲットを示します。持っていないので、if()ステートメントを使用するコードを分解してみてください。ジッタがこのコードを非常に異なって見えるマシンコードに変換するため、それ以外の点では重要ではありません。

于 2013-01-27T11:24:19.247 に答える