スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

cmp命令と条件分岐

アセンブリでの条件分岐には、cmp命令、ジャンプ系命令(je, jne, jbe)を使用します。
具体的な使用例を示す前に、cmp命令とジャンプ系命令についておさらいします。

まずcmp命令です。
cmp A, B (Aはレジスタ, Bはレジスタか数値)
という形式で記述します。そして、
A = B のとき、ZFに1、CFに1をセットします。
A > B のとき、ZFに0、CFに0をセットします。
A < B のとき、ZFに0、CFに1をセットします。

次にジャンプ系命令です。
je 0110
jne 0112
jbe 0114
と記述します。後に続く数値はジャンプ先のアドレスを示します。
ジャンプ系命令を一覧表の形にしたものはこちらを参照してください。

ジャンプ系命令の命名規則を知れば、条件分岐をイメージしやすくなると思います。
jneのjはjumpのj、nはnotのn、eはequalのe
jbeのbはB側の方が大きいよというb
規則が見えてきたでしょうか?
jneは、Jump if a Not Equals bでしょうか
jbeは、Jump if B lather than or Equals a(これは無理がある)
この調子で行くと、jaやjaeもありそうです。
上記のリンク先を見ればわかりますが、実際に存在します。



条件分岐をするときの基本的な流れは以下のような順序になるかと思われます。
1.値のセット
2.レジスタの比較
3.ジャンプ命令
比較の直後にジャンプ命令を挟みます。
4.処理



条件分岐説明の便宜上レジスタの初期化を省きました。
値が等しいときに何かする
2D2C:0100 cmp al, bl
2D2C:0102 jne 0106
2D2C:0104 mov al, 1
2D2C:0106
jneはZFが0のとき、つまりalの方が大きいか、blの方が大きいときにジャンプします。

値が等しいときに何もしない
2D2C:0100 cmp al, bl
2D2C:0102 je 0106
2D2C:0104 mov al, 1
2D2C:0106

alの方が大きいときに何かする
2D2C:0100 cmp al, bl
2D2C:0102 jbe 0106
2D2C:0104 mov al, 1
2D2C:0106

といった感じです。
変わるのはジャンプ命令の部分のみです。
しかしジャンプ命令に気をつけないとうっかりミスをしてしまいがちです。
実際、上のjbeをjaと書いてしまい、あわてて修正しました。

Aの方が大きいときに何かすると考えて、ja 0106 と書いてしまうと違った処理になってしまいます。
「A > Bのときに処理をする」と考えるのではなく、「A <= Bのときに処理をしない(=ジャンプする)」と考えるほうがいいでしょう。

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

プロフィール

森嶋晃介

Author:森嶋晃介
社会人2年目。
独学する勉強のために、いろいろ手を出して、それについて書いていく予定です。
今年こそ、たくさん書くぞ

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。