演算結果によって変化するステータスフラグの内、ゼロフラグとキャリーフラグについて説明します。 ゼロフラグはループ処理の終了判定と言った場面で頻繁に使いますし、キャリーフラグは8bit長を超える数値演算で重要な役割を果たします。 ニーモニックによってステータスフラグが変化するものと、そうでないものがありますから命令一覧表などで確認して使います。 期待した変化が得られない命令の後でステータスフラグによる分岐命令を書くと、不安定な動作を伴うバグとなって原因解明に苦労する場合があります。
ステータスフラグはSFRの一つ、STATUS の値です。 SFRもデータ・メモリーと同様に読み書きできますが、通常ステータスフラグを直接読んだり書き換えることは行わず、ステータスフラグの内容によって分岐する命令( BC , BNC , BNZ , BZ など)や、キャリーフラグ(またはボロー)の値を演算に含める命令( ADDWFC , SUBFWB , SUBWFB など)を使うことで活用されます。 (PICにボローフラグは無く、減算命令後のキャリーフラグの反転を使います。)
<<< ゼロフラグ >>>
「間接アドレッシング」で例示したソースリスト(下図)の31行目に BZ 命令を使っています。 30行目の MOVF で W に読み出した値によってゼロフラグが変化し、31行目でゼロフラグの値が1なら hotz に分岐します。
MOVF 命令でゼロフラグが変化することを確かめて使っています。
<<< キャリーフラグ >>>
キャリーフラグは8Bit長からの桁あふれ(オーバーフロー)を示すステータスフラグです。 下図の筆算で各桁毎に「1繰り上がる」場面でキャリーフラグの値が1になります。 10進数の筆算では一桁が0~9の値ですが、8bit長では0~255の値をカバーします。
キャリーフラグは「掛け算(乗算)」の例、参照アドレス計算の中で ADDWFC 命令を使って活用しています。
他のステータスフラグについては、必要の応じて別の記事で紹介します。
一連の記事のインデックスは 「とにかくビルド!」の末尾をご覧下さい。
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。
ステータスフラグはSFRの一つ、STATUS の値です。 SFRもデータ・メモリーと同様に読み書きできますが、通常ステータスフラグを直接読んだり書き換えることは行わず、ステータスフラグの内容によって分岐する命令( BC , BNC , BNZ , BZ など)や、キャリーフラグ(またはボロー)の値を演算に含める命令( ADDWFC , SUBFWB , SUBWFB など)を使うことで活用されます。 (PICにボローフラグは無く、減算命令後のキャリーフラグの反転を使います。)
<<< ゼロフラグ >>>
「間接アドレッシング」で例示したソースリスト(下図)の31行目に BZ 命令を使っています。 30行目の MOVF で W に読み出した値によってゼロフラグが変化し、31行目でゼロフラグの値が1なら hotz に分岐します。
MOVF 命令でゼロフラグが変化することを確かめて使っています。
<<< キャリーフラグ >>>
キャリーフラグは8Bit長からの桁あふれ(オーバーフロー)を示すステータスフラグです。 下図の筆算で各桁毎に「1繰り上がる」場面でキャリーフラグの値が1になります。 10進数の筆算では一桁が0~9の値ですが、8bit長では0~255の値をカバーします。
キャリーフラグは「掛け算(乗算)」の例、参照アドレス計算の中で ADDWFC 命令を使って活用しています。
他のステータスフラグについては、必要の応じて別の記事で紹介します。
一連の記事のインデックスは 「とにかくビルド!」の末尾をご覧下さい。
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。