こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PIC16のアセンブラ、あなたならどう書く?

PIC16のアセンブラ、あなたならどう書く?

こんにちは、PIC16シリーズのアセンブラについての質問です。MPASMのプログラム書き始めて3日ぐらい目です。すこしずつ、インストラクション・セットやアーキテクチャを把握してきた感じです。

C言語調で書きました下記の様なIF-ELSEをMPASMで書きたい時、皆さんならどの様に記述されますか?人に見られる可能性のあるコードですので、ちびっとぐらいは格好つけないといけない状態です(汗)。
  //===== Increase var0/1 =====
  if( sel == 0x00 ) {
    var0 ++;
    var1 = 0;
  } else {
    var1++;
    var0 = 0;
  }

下記は、自分なりのコードとそのコメントに当たります。
  ;===== Increase var 0/1 =====
  MOVF   sel, W    ; Switch by sel
  BTFSS  STATUS, Z  ; ..
  GOTO   $+4     ; ..
  INCF   var0     ; Case sel==0, var0++
  CLRF   var1     ;        var1=0
  GOTO   $+3     ;
  INCF   var1     ; Case sel!=0, val1=++
  CLRF   var0     ;       val0++
  NOP          ; Switch-close

もちろん、記述方法は記述者の好みがありますから、良し悪しではなく参考的な回答だと嬉しいです。こういう方が常識的だとか、こう記述すると後で見やすいとか、好き嫌いでもかまいません。よかったらご意見ください。よろしくお願いいたします。

投稿日時 - 2010-02-01 13:29:16

QNo.5640499

暇なときに回答ください

質問者が選んだベストアンサー

>  GOTO   $+4     ; ..
少なくともこのような書き方は勧められません。飛び先は名前で指定しましょう。それでないと、間に命令を入れたり、外したりするたびに+4の値を計算し直さなければならなくなります。

投稿日時 - 2010-02-03 00:45:02

お礼

レスありがとうございます。

> 飛び先は、名前で指定しましょう
確かに、そのとおりです(^^;

自分が書いている間は、$でもいいかもしれないですが・・・。他人のコードでしかも$が書かれたコードをメンテするとき、神経使いそうです。個人的ですが、ファンクションブロックの行数が十分少なく、見渡しが効く範囲での使用なら、それもアリかなぁと思いました。ラベルが少ないことで、コードがスッキリすると考えるからです。でも、それを真似た人が、100行先のアドレスに$を使うとも限らないですね。

もう一つ、ラベルを置く事で、このアドレスは、他の場所で参照される可能性を指示する目的もあるので・・・やっぱり、セオリーどおり$はやめるべきかなぁ。やめてと言われそうな気がしてきた(汗。

$使うの、やめときます。

-----
コメントとかどう思います?

投稿日時 - 2010-02-03 09:41:33

ANo.2

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

PIC16のアセンブラを知らないのですが、、、
--- --- --- --- --- --- --- --- ---
reg1 <- var0 の アドレス
reg2 <- var1 の アドレス

判定( sel = 0 )-> ★の場所

swap( reg1 <-> reg2 )


[reg1 が指すとこ] ++
[reg2 が指すとこ] <- 0
--- --- --- --- --- --- --- --- ---

自分が昔やっていたアセンブラではこの方が
容量もスピードもよかったです。

投稿日時 - 2010-02-02 14:19:09

お礼

うまいなぁ。
私がそのプロセッサ使っても、そうは書けなさそうです。

ブランチ先でする事が同じな場合、共通処理で書けば、引数の設定をしてから、共通のファンクションブロック(この場合★)を処理するが効率的だし、わかりやすいですね。

-----
PIC16は、本当に玩具(失礼?)みたいなプロセッサで、アキュムレータからつながる汎用レジスタは1個しかなくて、間接アクセスをできるレジスタも専用のレジスタ(アキュムレータとは違う)が1個あるだけなんです。今つかってるPICのRAMは、128バイトだけで、基本的に
  (1) {RAM又はリテラル} -> W
  (2) {RAM又はリテラル}とWで計算 -> W
  (3) W -> RAM
をひたすら繰り返す感じです。汎用レジスタ2個ぐらいほしいなぁ。汎用レジスタで間接アドレッシングしてほしいなぁ。でも、PICだから仕方ない(笑。

-----
にしても、構造化できるところは、構造化するように頭に入れときます。
参考になりました!ありがとうございました。

もし、コメント書くなら、どんな風に書きます?
暇あったらでいいですから、意見くださると嬉しいです。

投稿日時 - 2010-02-03 10:20:02

あなたにオススメの質問