Top Page/
MASMのメモ書き TOP
制御構文
これらの制御構文を使用すると、
アセンブリ言語のソースにおいて条件分岐先のラベル名を書く必要が無くなり、
非常に便利で、且つ見やすく保守性の高い(デバッグし易い)ソースが記述できる。
MASM5までは、条件分岐の度にラベル名を作成していたので、
「このラベル名使ったっけ?」と解らなくなる事態が起きていたし、
何よりも、ソースファイルの視認性が上がるので、保守性に優れたソースを書く事が出来る。
条件文 | 符号無し | 符号付き | 内容 |
(a) == (b) | je | cmp (a),(b) 命令にて、(a)==(b)かどうかチェック。 |
(a) != (b) | jne | cmp (a),(b) 命令にて、(a)!=(b)かどうかチェック。 |
(a) < (b) | jb | jl | cmp (a),(b) 命令にて、(a)< (b)かどうかチェック。 |
(a) <= (b) | jbe | jle | cmp (a),(b) 命令にて、(a)<=(b)かどうかチェック。 |
(a) > (b) | ja | jg | cmp (a),(b) 命令にて、(a)> (b)かどうかチェック。 |
(a) >= (b) | jae | jge | cmp (a),(b) 命令にて、(a)>=(b)かどうかチェック。 |
(a) & (b) | test | test (a),(b) 命令にて、zeroフラグをチェック。 |
(a) && (b) | | 条件文(a) と 条件文(b) 両方が成り立つかチェック。 |
(a) || (b) | | 条件文(a) と 条件文(b) どちらかが成り立つかチェック。 |
! (a) | | 条件文(a)を否定する。(ロジカルノット) |
carry? | jc (jb) | キャリーフラグ=High? |
overflow? | jo | オーバーフローフラグ=High? |
parity? | jp | パリティーフラグ=High? |
sign? | js | サインフラグ=High? |
zero? | jz (je) | ゼロフラグ=High? |
書式
.if (条件式(1))
; statement
.elseif (条件式(2))
; statement
.else (条件式(2))
; statement
.endif
説明
条件分岐命令を生成します。
".elseif" 及び ".else" は、省略可。
例
以下のように記述した場合、
.if (al==0)
.if (ah!=0)
statement1
.else
statement2
.endif
.elseif ((al==1) || !(bl & 80h))
statement3
.endif
以下と同等のコードが生成される。
or al,al ;0かどうかのチェックはOR命令となる。
jnz @Label1 ;.if (al==0)
or ah,ah
jz @Label2 ; .if (ah!=0)
statement1
jmp @Label3
@Label2: ; .else
statement2
jmp @Label3 ; .endif
@Label1: ;.elseif
cmp al,1
jz @Label4
test bl,80h
jnz @Label5
@Label4:
statement2
@Label3:
@Label5: ;.endif
上の通り、条件分岐構文をネストした時に分岐命令を減らす処理はしてくれる。
しかしながら、分岐の最適化までは行わないので、
Pentium以降のCPUにおける分岐予測を考慮したコーディングは、プログラマーにて行う。
Pentium以降のCPUにおける分岐予測のルールとして、
- 無条件ジャンプは、分岐すると予測する。
- 分岐予測テーブルに無い場合は、前方条件分岐(.if)は分岐しないものと予測する。
- 分岐予測テーブルに無い場合は、後方条件分岐(.while, .repeat)は分岐するものと予測する。
というルールがあり、一番、分岐の確立が高い処理は、.ifの直後に持ってくると良い。
同様に、一番、分岐の確立が低い処理は、.elseの直後に持ってくると良い。
書式
.while (条件式)
; statement
.endw
説明
条件ループを生成します。
条件式の評価は、ループの最初に行い、式が成り立つ間、実行を繰り返えす。
例
以下のように記述した場合、
.while (cx>0)
statement
.endw
以下と同等のコードが生成される。
jmp @Label1
@Label2:
statement
@Label1:
or cx,cx
jnz @Label2
上の通り、条件式の評価はループの最後尾で行う。
従って、Pentium以降のCPUにおける条件分岐のルール
「分岐予測テーブルに無い場合は、後方条件分岐(.while, .repeat)は分岐するものと予測する。」
に適合する。
書式
.repeat
; statement
.until (条件式)
説明
条件ループを生成します。
条件式の評価は、ループの最後に行い、式が成り立つまで、実行を繰り返えす。
(つまり、必ず1回は実行される。)
".until 0"と記述した場合は、無限ループになる。
又、".until (条件式)"の代わりに、".untilcxz"が記述可能で、"LOOP"命令となる。
書式
説明
.while若しくは、.repeatによるループを抜ける。
".if (条件式)"を記述した場合、条件式の成立時となる。
書式
説明
.while若しくは、.repeatによるループ時において、条件式の評価に戻る。
".if (条件式)"を記述した場合、条件式の成立時となる。