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_インラインアセンブラ
- アセンブリ言語