PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第59回]
●PICのC(キャリーフラグ)
前回のPICアセンブラプログラムの説明です。
PICのマシン語命令には相当にアクの強いクセがあります。
8080やZ80のアセンブラと真逆のところがあってつい混乱させられます。
そのクセは特に演算命令に強く出ています。
うっかりすると間違ってしまいます。
なかでもSUB(減算命令)がZ80などとは全く逆の動作になります。
Z80ではAレジスタがACCUMULATOR(アキュムレータ、加算レジスタ)として使われます。
名前は加算レジスタですが減算命令でもAレジスタが使われます。
たとえば
SUB 12
という命令はAレジスタの現在の値から12(16進数)を引いて結果をAレジスタに入れるという計算動作になります。
この命令(ニーモニック)にはAレジスタは出てきませんがAレジスタを使うというのが暗黙のルールになっています。
これがPICのアセンブラではこうなります。
SUBLW 12
PICの場合アキュムレータはWレジスタが使われます。
上の命令はPICの減算命令です。
その演算動作はというと。
12(16進数)からWレジスタの現在の値を引いてその結果をWレジスタに入れるという動作になります。
なんだかなあという感じです。
どうしてそういうヘソが曲がったような仕様にしているのでしょう。
納得はいきませんけれど、PICの場合それに慣れるしかありません。
ヘソ曲がりの極め付きが今回のテーマのCフラグ(キャリーフラグ)です。
Cフラグは加算命令や減算命令の実行によって上位桁へのキャリーが発生したときにセットされます(1になります)。
減算命令の場合には引ききれなくて上位桁からのボローが発生したときにセットされます(1になります)。
減算命令の場合にはCフラグがボローフラグとして使われます。
以上はZ80などのアセンブラ命令の場合です。
ところがこれがPICの場合とんでもないことになってしまいます。
PICの場合も加算命令の場合には上位桁へのキャリーが発生したときにCフラグがセットされます(1になります)。
しかしそれが減算の場合には…。
ということでそれを確かめるために作ったのが前回のテストプログラムです。
実はPICアセンブラの場合開発ツールのMPLABにはデバッグ機能が使えるのでそれを使えばSUB命令でのCフラグの動作を確認することができます。
私自身もMPLABのデバッグ機能を使って確認いたしました。
でも私としてはMPLABのデバッグは面倒で本当のところをいうと余り使いたくはありません。
私の使い方としてはもっぱらMPLABは単なるPICアセンブラとして使っているのでフロジェクトとかなんたらかんたらなんて面倒なことはパスしてしまっていきなり「Project」→「Quickbuild」で済ませてしまっています。
それで十分ですし文字通り「Quick」なのです。
しかしMPLABでデバッグ機能を使おうとするとまずはProjectを登録してそれからそこにソースプログラムを登録して…という手順で進むことになります。
普段そういう遣い方に慣れてみえる方ならばなんてことはないのでしょうけれど。
私はそういう使い方はしていませんので、面倒やなあ、と思います。
それで。
おお、そうだ。
せっかくの「PICアセンブラ in BASIC」があるのだから、これを使えば簡単ではないか。
それを簡単と思うのは私の「個人の感想」であります。
前回お見せしたサンプルプログラムです。
10 abc=$10:xyz=$20 20 asm 30 movlw 50 40 subwf abc 50 btfsc STATUS,0 60 goto *jp1 70 incf xyz 80 goto *end 90 *jp1 100 decf xyz 110 *end 120 endasm 130 print abc,xyz |
30 movlw 50
でWレジスタに50(16進数)が入れられます。
次の
40 subwf abc
で
abc=abc−w
という計算が行なわれます(PICの場合w=w−abcではありません)。
この場合に
subwf abc,w
とすると
w=abc−w
という計算になります(なんだかなあ)。
abcには
10 abc=$10
で16進数の10が入っていますからその計算は
abc=10−50
という計算を実行することになり上位桁からのボローが発生することになります。
PICの場合にも減算命令のボローはCフラグが使われます。
PICのCフラグはSTATUSレジスタのビット0に置かれています。
50 btfsc STATUS,0
という命令はSTATUSレジスタのビット0(つまりCフラグ)がクリアされていれば次の命令をスキップする、という命令です。
もしCフラグがクリアされていたら
70 incf xyz
が実行されます(xyzの値が+1されます)。
もしセットされていたら
*jp1に飛んで
100 decf xyz
が実行されます(xyzの値が−1されます)。
xyzには16進数の20が入っています。
実行した結果はどうなったでしょうか?
前回お見せしたブログラムを実行した結果を再掲します。
プログラムを実行した結果abcの値はC0になり確かに上位桁からのボローが発生しています。
16進数ではわかりにくいかもしれません。
10進数に直して計算してみますと。
(上位桁から)256+16−80=92(16進数C0)
ところで。
xyzの値は21になりました。
減算命令でボローが発生しているのにCフラグは「クリア」されています。
なんともたませらんなあというPICの振る舞いであります。
PICの減算命令ではボローが発生しない場合には逆にCフラグがセットされます。
うむむむむ。
たまらん。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet(赤線は筆者)
PICBASICコンパイラ[第59回]
2023.8.1upload
前へ
次へ
ホームページトップへ戻る