コンディションコードレジスタ(CCR)

0から7までの汎用レジスタとは別の、プログラムの状態によって変化するフラグのレジスタ。プログラムから直接読むことは少ない。 基本的には、条件分岐の際に暗黙的に参照、利用される。

プログラムを書くときに意識するフラグ

ゼロフラグ 演算の結果がゼロになったとき真。または比較した数値が等しいとき真。
ネガティブフラグ 演算の結果が負数になったとき真
オーバーフローフラグ 演算の結果がオーバーフローしたとき真

ゼロフラグを変化させる命令のうち、よく使うもの

cmp 命令を使わなくても、結果がゼロになったら分岐する、という使い方ができる。

よく使う分岐命令

Branch Not Equal (bne)

演算の結果がゼロでないとき分岐先に飛ぶ。つまりゼロフラグが偽のとき飛ぶ。

i = 10;
do {
  ...
} while (--i != 0);
    mov.b   #10,r0l
do:
    ...
    dec.b   r0l
    bne     do
while_end:

Branch EQual (beq)

演算の結果がゼロのとき分岐先に飛ぶ。比較命令を減算と考えることで理解しやすい(2つの数値が等しいとき、減算するとゼロになるため)

if (a != b) {
  ...
}
    cmp.w   e0,e1
    beq     if_end
    ...
if_end:

Branch Greater or Equal(bge)

for (i = 0; i < 10; ++i) {
  ...
}
    sub.b   r0l,r0l
for_start:
    cmp.b   #10,r0l     ; A = r0h, B = 10
    bge     for_end     ; IF A >= B THEN GOTO for_end
    ...
    inc.b   r0l
    bra     for_start
for_end:

諸注意

1命令の実行ごとに自動的に変化するため、なるべく直後に利用すること