今回は計算を行います。命令の一覧をこちら「命令一覧」に載せておきました。まあ、眺める分には不自由しないでしょう。とりあえず今回使う「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
}
ではまた次回。