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

関連ページ