簡単なアセンブラでの条件分岐
PICマイコン(Peripheral Interface Controller)のためのプログラムをアセンブラで書いていくとき、どうすれば条件分岐ができるのか最初はとまどいます。
まずは基本的なものを書いてみます。
条件分岐の発展系はこちらから
C言語などで、
if( TEST_VAR == 10 ) {
//何かの処理
}
などというようなことをアセンブラしたい場合はどのようにすればよいのでしょうか?
※変数TEST_VARが10かどうかで処理を変えたいときはどうすればよいのか
TEST_VAR = 10 ということは、 TEST_VAR - 10 = 0
ということなので、10をひいて、その値が0かがわかればどうにかできます。
これはPICのゼロフラグ(Z)をチェックすることによって解決できます。
今回のプログラムでは、TEST_VARが10かどうかで、ポートBの出力が 変わるようになっています。
よって、ポートにLEDでもつないでおけば確認がしやすいでしょう。
まずは基本的なものを書いてみます。
条件分岐の発展系はこちらから
C言語などで、
if( TEST_VAR == 10 ) {
//何かの処理
}
などというようなことをアセンブラしたい場合はどのようにすればよいのでしょうか?
※変数TEST_VARが10かどうかで処理を変えたいときはどうすればよいのか
TEST_VAR = 10 ということは、 TEST_VAR - 10 = 0
ということなので、10をひいて、その値が0かがわかればどうにかできます。
これはPICのゼロフラグ(Z)をチェックすることによって解決できます。
今回のプログラムでは、TEST_VARが10かどうかで、ポートBの出力が 変わるようになっています。
よって、ポートにLEDでもつないでおけば確認がしやすいでしょう。
以下がサンプルです。実験用に作ったものを多少変更して載せているだけですが、
参考にしていただければ幸いです。
※PIC16F88で動作確認したスクリプトを単純化しました
◆サンプルスクリプト
ポイントとなる部分は以下のあたりです。
▲値のセット
MOVLW D'10' ;ここに好きな値をセットして試してみてください
MOVWF TEST_VAR
▲比較の実行
MOVF TEST_VAR,W ;「Wレジスタ = TEST_VAR」
SUBLW D'10' ;「Wレジスタ = 10 - Wレジスタ」ここが比較したい値
MOVWF TEST_VAR2 ;「TEST_VAR2 = Wレジスタ」
MOVF TEST_VAR2,F ;自分自身にコピー(Zフラグを調べたいから)
BTFSS STATUS,Z ;Zフラグが1なら(TEST_VAR2が0なら)TEST_TTには行かない
GOTO TEST_TT ;TEST_VARが10以外のとき(TEST_VAR2を調べた結果、Zフラグが0のとき)はここが実行されてTEST_TTラベルに飛びます
;TEST_VARが10のときの処理を以下に書いておけばよい
GOTO TEST_TT2
◆関連記事
条件分岐の発展系
※なにぶん初心者なもので、間違いもあるかもしれませんがご容赦ください。
応援お願いします(人気blogランキングへ)
参考にしていただければ幸いです。
※PIC16F88で動作確認したスクリプトを単純化しました
◆サンプルスクリプト
ポイントとなる部分は以下のあたりです。
▲値のセット
MOVLW D'10' ;ここに好きな値をセットして試してみてください
MOVWF TEST_VAR
▲比較の実行
MOVF TEST_VAR,W ;「Wレジスタ = TEST_VAR」
SUBLW D'10' ;「Wレジスタ = 10 - Wレジスタ」ここが比較したい値
MOVWF TEST_VAR2 ;「TEST_VAR2 = Wレジスタ」
MOVF TEST_VAR2,F ;自分自身にコピー(Zフラグを調べたいから)
BTFSS STATUS,Z ;Zフラグが1なら(TEST_VAR2が0なら)TEST_TTには行かない
GOTO TEST_TT ;TEST_VARが10以外のとき(TEST_VAR2を調べた結果、Zフラグが0のとき)はここが実行されてTEST_TTラベルに飛びます
;TEST_VARが10のときの処理を以下に書いておけばよい
GOTO TEST_TT2
◆関連記事
条件分岐の発展系
※なにぶん初心者なもので、間違いもあるかもしれませんがご容赦ください。
応援お願いします(人気blogランキングへ)