Top PageMASMのメモ書き 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 〜 .elseis 〜 .else 〜 .endif

書式


	.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 〜 .endw

書式


	.while	(条件式)

;	statement

	.endw

説明

条件ループを生成します。
条件式の評価は、ループの最初に行い、式が成り立つ間、実行を繰り返えす。

以下のように記述した場合、


	.while	(cx>0)
	statement
	.endw

以下と同等のコードが生成される。


	jmp	@Label1
@Label2:
	statement
@Label1:
	or	cx,cx
	jnz	@Label2

上の通り、条件式の評価はループの最後尾で行う。
従って、Pentium以降のCPUにおける条件分岐のルール
「分岐予測テーブルに無い場合は、後方条件分岐(.while, .repeat)は分岐するものと予測する。」
に適合する。

.repeat 〜 .until

書式


	.repeat

;	statement

	.until	(条件式)

説明

条件ループを生成します。
条件式の評価は、ループの最後に行い、式が成り立つまで、実行を繰り返えす。
(つまり、必ず1回は実行される。)
".until 0"と記述した場合は、無限ループになる。
又、".until (条件式)"の代わりに、".untilcxz"が記述可能で、"LOOP"命令となる。

.break

書式


	.break	(.if	(条件式))

説明

.while若しくは、.repeatによるループを抜ける。
".if (条件式)"を記述した場合、条件式の成立時となる。

.continue

書式


	.continue	(.if	(条件式))

説明

.while若しくは、.repeatによるループ時において、条件式の評価に戻る。
".if (条件式)"を記述した場合、条件式の成立時となる。