今回は解析から横道にそれてソースコード自体に目を向けます。
MSILでは命令間の空白は全て空いているかいないかで判断されるようです。つまり、C言語と同じようにフリ-スタイルで書けるということです。
.assembly extern mscorlib {}.assembly hello {}.method static public void main() cil managed{ .entrypoint .maxstack 1 ldstr "Hello world!" call void [mscorlib]System.Console::WriteLine(class System.String) ret}
適切な隙間をあければ、上のようなことも出来ます。なかなか面白いです。でも、普段は普通に書きましょう。
ちなみに、このように書いても逆アセンブルするときちんとタブ下げされた綺麗なコードが出てきます。
逆アセンブルすると「IL_0000:」のようなものが追加されていることが分かります。分かっている方もいると思いますが、これはラベルです。ラベルの書き方は「~~~:」です。そのうち使うことになりますが、まだジャンプが出来ないので今のところ使いません。
その代わりといってはなんですが、ここに書いてある数値から命令のバイト数を計算することが出来ます。そういうことが好きな方はやってみてください。
この2つはよく命令の先頭に着いています。おそらくは「load」「store」の略だと思います。スタックに読み込むのが「load」スタックから取り出すのが「store」です。ここでは「pop(スタックから取り出す)」「push(スタックに積む)」という用語を使っていますが、私はどちらでも構わないと思います(厳密には違いますよ)。
今回はちょっと休憩と言うことで軽めの話題です。ここまでで分からないことがある方は一度見直してみる方が良いと思います。次回心機一転。また新しいことに挑戦したいと思います。