GAS_制御構造
GAS (The GNU Assembler) 反復処理
ジャンプ命令
jmp命令は指定したアドレスに無条件に分岐します。
アドレスの指定にはラベルを用いることが可能です。
jmp [アドレス]
jmp命令とは、実際には命令ポインタ(eip)に対して、次に実行すべきコードのアドレスを代入している処理となります。
jmp adress = movl $adress, %eip
ジャンプ命令による反復処理は以下のように記述できます。
.data
.text
.global main
main:
push %ebp
movl %esp, %ebp
movl $0, %eax # eax = 0
loop:
inc %eax # eax++
cmpl $10, %eax
jb loop # if(eax < 10) goto loop
leave
ret
GAS (The GNU Assembler) 条件分岐
比較命令
処理の条件分岐を行う場合には、比較命令を実行した結果を用いることができます。
cmp [値1] [値2]
比較結果はフラグレジスタ(eflags)に設定されます。
(フラグレジスタについてはx86-レジスタを参照下さい。)
cmpはcompare(比較する)の略です。
分岐命令
条件付き分岐命令は、「Jump if Condition Is Met」と呼ばれる命令セットを使います。
EFLAGSのステータスフラグの状態を調べて、オペランドで指定された分岐先へジャンプします。
[jcc] [アドレス]
例えば「cmp A, B」を実行した場合に以下の条件分岐を行います。
| 命令 | 説明 | 備考 |
|---|---|---|
| JA | AよりBが大きい (A < B) | CF = 0, ZF = 0 |
| JB | AよりBが小さい (A > B) | CF = 1 |
| JE | AとBが等しい (A = B) | ZF = 1 |
- ZF(ゼロフラグ)
- 直前の演算結果が0になったときにONになります。
- CF(キャリーフラグ)
- 符号なし整数演算時の桁あふれが発生した場合にONになります。
Jump if Condition Is Met一覧
| 命令 | 説明 | フラグ |
|---|---|---|
| JA | より上 | CF = 0 & ZF = 0 |
| JAE | より上か等しい | CF = 0 |
| JB | より下 | CF = 1 |
| JBE | より下か等しい | CF = 1 | ZF = 1 |
| JC | キャリーがある | CF = 1 |
| JCXZ | CXレジスタが0 | |
| JE | 等しい | ZF = 1 |
| JG | より大きい | ZF = 0 & SF = OF |
| JGE | より大きいか等しい | SD = OF |
| JL | より小さい | SF ! OF |
| JLE | より小さいか等しい | ZF = 1 | SF ! OF |
| JNA | より上でない | CF = 1 | ZF = 1 |
| JNAE | より上でなく等しい | CF = 1 |
| JNB | より下でない | CF = 0 |
| JNBE | より下でなく等しい | CF = 0 & ZF = 0 |
| JNC | キャリーがない | CF = 0 |
| JNE | 等しくない | ZF = 0 |
| JNG | より大きくない | ZF = 1 | SF ! OF |
| JNGE | より大きくなく等しくない | SF ! OF |
| JNL | より小さくない | SF = OF |
| JNLE | より小さくなく等しくない | ZF = 0 & SF = OF |
| JNO | オーバーフローがない | OF = 0 |
| JNP | パリティがない | PF = 0 |
| JNS | 符号がない | SF = 0 |
| JNZ | ゼロではない | ZF = 0 |
| JO | オーバーフローがある | PF = 1 |
| JP | パリティがある | PF = 1 |
| JPE | パリティが偶数 | PF = 1 |
| JPO | パリティが基数 | PF = 0 |
| JS | 符合がある | SF = 1 |
| JZ | ゼロである | ZF = 1 |
関連ページ
- GAS_基本文法
- GAS_基本書式
- GAS_演算子
- GAS_制御構造
- GAS_関数
- GAS_システムコール
- GAS_標準ライブラリ関数
- GAS_Intel記法の利用
- GAS_インラインアセンブラ
- アセンブリ言語