コンディションコードレジスタ(CCR)
0から7までの汎用レジスタとは別の、プログラムの状態によって変化するフラグのレジスタ。プログラムから直接読むことは少ない。 基本的には、条件分岐の際に暗黙的に参照、利用される。
プログラムを書くときに意識するフラグ
ゼロフラグ | 演算の結果がゼロになったとき真。または比較した数値が等しいとき真。 |
ネガティブフラグ | 演算の結果が負数になったとき真 |
オーバーフローフラグ | 演算の結果がオーバーフローしたとき真 |
ゼロフラグを変化させる命令のうち、よく使うもの
dec
mov
(mov.b r0l,r0l
と使えば、簡単なゼロチェックができる)
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命令の実行ごとに自動的に変化するため、なるべく直後に利用すること