基本情報技術者の午後試験をCASL2で受けようと思っている方の中には、フラグレジスタの動きについてイマイチ理解し難いと感じている方も多いのではないでしょうか?
CASL2では、命令によって
フラグレジスタを変化さえるものと
そうでないものの2種類が存在しています。
今回はそれについて見てみたいと思います。
フラグレジスタを変化させる 命令一覧
以下に示す命令が、フラグレジスタの内容を変化せせる命令郡です。
実は、フラグレジスタの変化は、比較命令を除いた何らかの
計算処理する命令のときだけに起こります。
これは、COMET2のハードウェアにおいてフラグレジスタが算術論理演算装置(ALU)に付属していることに関係しています。
【加算・減算命令】
【シフト演算命令】
【論理演算命令】
【比較命令】
フラグレジスタを変化させない 命令一覧
以下の命令を実行した場合は、フラグレジスタの状態を変化させません。
【データ転送命令】
【分岐命令】
【アセンブラ命令】
【マクロ命令】
【スタック用の命令】
【その他の命令】
フラグレジスタは 分岐命令 を使うときだけ気にすればOK
実は、フラグレジスタの内容を意識するタイミングというのは
分岐命令を使用するときだけになります。
したがって、使用する命令が、フラグレジスタを変化させるか否かを把握しておくことが必要になります。
よく勘違いしてしまう例で以下のような場合があるので、見てみましょう。
同じ意味の命令でもフラグレジスタによって違う動きになってしまう
同じ意味の命令というのは、例えば...
- SUBA GR1, =1 (SUBL GR1, =1)
- LAD GR1, -1, GR1
のように、計算結果が同じになるような命令のことです。
この二つの命令は共にGR1の値をデクリメント( -1)する意味の記述です。
しかし、SUBA命令とLAD命令ではフラグレジスタに影響を与えるか否かの違いがあることに気づかない場合があります。
以下の例1、例2はどちらも
GR1に
1という値が格納されているものとして見てみます。
例1:SUBA命令での分岐
例2:LAD命令での分岐
LP LAD GR1, -1, GR1
JNZ LP
例1の
SUBA命令による減算の場合、
フラグレジスタが変化するので、JNZ命令で分岐せずに処理が終了します。
しかし、
例2の
LAD命令による減算の場合、
フラグレジスタを変化させることはできないので、JNZ命令が機能し続け無限にループしてしまいます。
このように、CASL2では記述の仕方は異なっても、同じ意味になる命令が存在します。
しかし、フラグレジスタの仕様の関係で違う動作をすることがあるため、同じ意味になるとはいえ命令を使用する際は注意してください。
最後に
フラグレジスタの動作と命令の関係について見てみました。
本番の試験でもフラグレジスタの動作を心得ているかを試されるので、フラグが変化する命令とそうでないものを覚えておくといいと思います。
それでは、続きはまた次回にご期待を!