« 無料ホスティング「XREA」が利用不能の状態に | メイン | 簡単なアセンブラでの条件分岐 »



アセンブラでの条件分岐その2

PICのためのプログラムをアセンブラで書いていくとき、どうすれば条件分岐できるかわからなくなりそうだったのでメモとして残しておきます。(ほとんど自分用(苦笑))

C言語などで、
if( TEST_VAR > 10 ) {
    //何かの処理
}

などとしたい場合はどのようにすればよいのでしょうか?

TEST_VAR > 10 ということは、 TEST_VAR  - 10 >  0
ということなので、10をひいて、その値が正か負かがわかればどうにかできます。
これはPICのキャリーフラグ(C)をチェックすることによってどうにかできます。

今回のプログラムでは、TEST_VARが10より大きいかどうかで、ポートBの出力が 変わるようになっています。
よって、ポートにLEDでもつないでおけば確認がしやすいでしょう。

比較した後、10以下ならTEST_VARに1を足して、TEST_VARが10より大きくなるまで 永遠に比較を続けるというプログラムです。



以下がサンプルです。実験用に作ったものを多少変更して載せているだけですが、
参考にしていただければ幸いです。

※PIC16F88で動作確認したスクリプトを単純化しました


◆サンプルスクリプト

ポイントとなる部分は以下のあたりです。

▲値のセット
MOVLW D'8'   ;ここに好きな値をセットして試してみてください
MOVWF TEST_VAR

▲比較の実行
;引き算の結果が0または正のとき、Cフラグは1 ?
;引き算の結果が負のとき、Cフラグは0 ?


MOVF TEST_VAR,W   ;「Wレジスタ = TEST_VAR」
SUBLW D'10'   ;「Wレジスタ = 10 - Wレジスタ」ここが比較したい値

;Cフラグが1なら(TEST_VARのほうが大きかったら)TEST_TTには行かない
;ここをBTFSCとすれば、条件を逆にできる

BTFSS STATUS,C
GOTO TEST_TT  ;TEST_VARが10より大きいときはここが実行されてTEST_TTラベルに飛びます

;TEST_VARが10以下のときの処理 if(TEST_VAR<=10) {
INCF TEST_VAR,F   ;TEST_VAR++



※なにぶん初心者なもので、間違いもあるかもしれませんがご容赦ください。




応援お願いします(人気blogランキングへ)

トラックバック

このエントリーのトラックバックURL:
http://www.bird-soft.net/mt/mt-tb.cgi/59

コメントを投稿