Capture The Frog

かえるぴょこぴょこw

MENU

アセンブリ言語入門 その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 }

 できました!

最初に比べたらだいぶ早くなってきたのかなあと思います。

皆さんもぜひ実際に手を動かして、セルフ逆アセンブラしてみるのもいいかもしれません。

お疲れ様でした。

次回は、関数についてやっていきたいと思います。

qwertytan.hatenablog.jp