[Atelier Blue アトリエブルー]Homeプログラミング IL(CIL,MSIL)>計算させる

計算させる

今回は計算を行います。命令の一覧をこちら「命令一覧」に載せておきました。まあ、眺める分には不自由しないでしょう。とりあえず今回使う「add」と「sub」を見つけたら戻ってきて下さい。

スタックに積んで計算

計算を行うためにはまず2つの値を積まなければいけません。というわけで積みます。そして、「add」を実行すれば値がスタックに乗っかるのでWriteLineで書き込めるという算段です。

.assembly extern mscorlib {}
.assembly outnum {}

.method static public void main () cil managed
{
    .entrypoint
    ldc.i4.1
    ldc.i4.2
    add
    call void [mscorlib]System.Console::WriteLine(int32)
    ret
}

どうでしょうか?出来ましたか?

ではこの勢いでちょっと複雑な計算をしてみましょう。計算式は次の通りです。

「1+2-3+4」逆ポーランド記法で書くと「1 2+3-4+」ですね。

.assembly extern mscorlib {}
.assembly outnum {}

.method static public void main () cil managed
{
    .entrypoint
    ldc.i4.1
    ldc.i4.2
    add
    ldc.i4.3
    sub
    ldc.i4.4
    add
    call void [mscorlib]System.Console::WriteLine(int32)
    ret
}

結果は………「4」合っています。まあ、これでも良いです。でも、加法定理の中では並べ替えを行うことが出来ますよね?というわけで並び替えてみましょう。それと、今回は「-3」を一区切りと考えて全て足し算で行ってみましょう。

.assembly extern mscorlib {}
.assembly outnum {}

.method static public void main () cil managed
{
    .entrypoint
    ldc.i4.1
    ldc.i4.2
    ldc.i4.s -3
    ldc.i4.4
    add
    add
    add
    call void [mscorlib]System.Console::WriteLine(int32)
    ret
}

当然の事ながら答えは合っています。では次にもっと長い式行っていましょう。

「1+2+3+4+5+6+7+8+9+10」答えは55ですね。これを行ってみましょう。

.assembly extern mscorlib {}
.assembly outnum {}

.method static public void main () cil managed
{
    .entrypoint
    ldc.i4.1
    ldc.i4.2
    ldc.i4.3
    ldc.i4.4
    ldc.i4.5
    ldc.i4.6
    ldc.i4.7
    ldc.i4.8
    ldc.i4.s 9
    ldc.i4.s 10
    add
    add
    add
    add
    add
    add
    add
    add
    add
    call void [mscorlib]System.Console::WriteLine(int32)
    ret
}

実行すると………あらら。エラーがでてしましました。というわけで何がいけないのかを解決したいところですがまた次の回に行いたいと思います。とりあえずしたに動くコードを載せておきます。どうして失敗するのかは逆アセンブルすると分かるかもしれませんよ。

.assembly extern mscorlib {}
.assembly outnum {}

.method static public void main () cil managed
{
    .entrypoint
    ldc.i4.1
    ldc.i4.2
    add
    ldc.i4.3
    add
    ldc.i4.4
    add
    ldc.i4.5
    add
    ldc.i4.6
    add
    ldc.i4.7
    add
    ldc.i4.8
    add
    ldc.i4.s 9
    add
    ldc.i4.s 10
    add
    call void [mscorlib]System.Console::WriteLine(int32)
    ret
}

ではまた次回。


ページの一番上へ
前のページへ一覧に戻る 次のページへ
初版2006-4-5
[Atelier Blue アトリエブルー]Homeプログラミング IL(CIL,MSIL)>計算させる