アセンブリ言語入門 その5
今回は、While文についてやっていきます。
While文
While文には、初期化・継続条件・アップデート文が必要です。初期化は一度だけ行われて継続条件までアップデート文に従って処理を続ける。ってとこでしょうか。
それでは、前回と同様C言語と見比べてみましょう。
一応、for文
int i;
for(i = 0 ; i < 7 ; i + +){
}
これをWhile文で表すと、
int i = 0;
while ( i < 5 ){
i++;
}
アセンブリでこれを表すときには、ジャンプを利用します。
if文でもジャンプを使いましたがWhile文でも使います。
whileの中身の処理を行って、継続条件に合わなくなったら、whileからジャンプして抜けます。では、実際に見てみましょう
mov [i], 0 ;初期化
while_start: ;while文スタート!
cmp [i], 5 ;条件にあっているか判断・フラグを設定
jge end ;上の処理で条件にあったなかったらendにジャンプ
mov eax, [i] ;EAX=i
add eax, 1 ;アップデート文
mov [i], eax ;戻す
jmp while_start ;while文の一番最初にジャンプ!
end:
んん、なんか古典的ですよね、、
コメントでも一応書きましたが、ここに改めて流れをまとめておくと
初期化
while文スタート!
条件にあっているか判断・フラグを設定
上の処理で条件にあったなかったらendにジャンプ
アップデート文
while文の一番最初にジャンプ!
一番最後で後ろ向きのジャンプが入っているのがwhile文の特徴です。
前にぴょこぴょこしてって、後ろにぴょこってするんですよね(謎
今回のwhile文自体は前回の内容がわかっていれば、そんなに難しくないと思います。
実践編
mov dword ptr [ebp-8], 1
mov dword ptr [ebp-4], 1
loc_401014:
cmp dword ptr [ebp-4], 4
jge short loc_40102E
mov eax, [ebp-8]
add eax, [ebp-4]
mov [ebp-8], eax
mov ecx, [ebp-4]
add ecx, 1
mov [ebp-4], ecx
jmp short loc_401014
loc_40102E:
これが、while文だって言えるのは、やっぱりいちばん最後の
jmp short loc_401014
があるからですね。見逃したら迷子になる。
1,
とりあえず読みやすくする。
[ebp-8]をa
[ebp-4]をbと置きました。
そして、while文だと分かったのでwhile:とend:に書き換えました。
dword ptrはプログラムの動きに直接関係ないので、消しました。
mov a, 1
mov b, 1
while:
cmp b, 4
jge short end
mov eax, a
add eax, b
mov a, eax
mov ecx, b
add ecx, 1
mov b, ecx
jmp short loc_401014
end:
この作業にも結構なれてきましたね。
jgeとは、比較結果が大きい場合、等しい場合にジャンプするので、
比較結果がbより小さい、等しくないときはwhileの処理を実行するということです。
2,
高級言語に変換していく
a=1
b=1
while(b<4){
eax=a
eax=eax+b
a=eax
ecx=b
ecx=ecx+1
b=ecx
}
こんな感じですかね。でも、まだちょっと読みにくいので整理します。
a=1
b=1
while(b<4){
eax=a+b
a=a+b
ecx=b
ecx=b+1
b=b+1
}
できました!
最初に比べたらだいぶ早くなってきたのかなあと思います。
皆さんもぜひ実際に手を動かして、セルフ逆アセンブラしてみるのもいいかもしれません。
お疲れ様でした。
次回は、関数についてやっていきたいと思います。