PICのデータ移動命令の使い方

A.移動命令

【移動命令の種類】

指定したレジスタへデータをコピーする命令です。
MOVF f,d、MOVWF f、MOVLW k、CLRF、CLRWがこれに属しまず。

nemonic   : 内容      :Flag  :Cycle :命令コード
---------------------------------------------------------------------
MOVF  f,d : f -> dest   : Z   : 1  : 00 1000 dfff ffff
MOVWF f  : w -> f    : None : 1  : 00 0000 1fff ffff
MOVLW k  : k -> w    : None : 1  : 11 00xx kkkk kkkk
CLRF  f  : 00h -> f   : Z(=1) : 1  : 00 0001 1fff ffff
CLRW    : 00h -> w   : Z(=1) : 1  : 00 0001 0xxx xxxx


【移動命令の動作】

命令の実際の動作を図1で説明します。



(1)命令のフェッチ
 まずプログラムカウンタで指定されたアドレスの命令が、命令レジスタ
 に取り出されます。
(2)命令の解読
 命令レジスタでは、まず命令の命令コードの部分を解読し実行します。
(3)データレジスタの取り出し。
 MOVF命令は、図2(a)の構造で命令レジスタに行くと、命令内のfで指定
 される、レジスタファイルのf番地のデータを取り出し、それをデータバス
 経由で転送して、命令構造の、dが0ならWregにコピーし、dが1なら自分
 自身にコピーします。
 従ってこの動作の時にはALUは関与しません。普通の使い方は、d=0で
 データをWregに取り出すために使いますが、d=1の時でも、STATUSレジ
 スタの内容は更新されるので、fレジスタがゼロかどうかを判定するときに
 使います。
(4)MOVWF命令の動作
 MOVWF命令では、MOVFとは逆に、Wregの内容を、fレジスタにコピーし
 ます。データはやはりデータバス経由で運ばれます。



【リテラル移動命令の動作】

MOVLW命令は、図2(c)の構造をしており、命令の中にある定数kを、ALUを
素通りさせてWregにコピーします。
クリア命令は移動命令のリテラル型と考えれば良く、リテラルデータがゼロ
だということです。
つまり、CLRFとCLRW命令は、このリテラル移動命令の特別なもので、ゼロ
のデータをfレジスタ(CLRFの時)かWreg(CLRWの時)にコピーします。

動作の流れは下図のようになります。




【移動命令の使い方】


  (1)演算プログラムへの応用

 算術演算や論理演算はプログラムの基本です。単純な演算のプログラム例で作り方の実際を説明します。BTFSCという命令を使っていますが、これは次回詳しく説明します。

2バイトデータの足し算(A(2バイト)+B(2バイト)→B)

   MOVF   ALOW,W   ;下位A+B
   ADDWF  BLOW,F   ;A+B→B
   BTFSC  STATUS,C  ;オーバーフローしたら上位に+1
   INCF   BHIGH,F
   MOVF   AHIGH,W   ;上位A+B
   ADDWF  BHIGH,F   ;A+B→B
   
下位4ビットの比較(PとQの比較)

   MOVF   P,W    ;Pの取りだし
   XORWF   Q,W    ;比較
   ANDLW   0FH     ;下位4ビットだけ
   BTFSC   STATUS,Z  ;同じか?
   GOTO   SAME    ;同じ時の処理へジャンプ
   GOTO   NOTSAME  ;違うときの処理へジャンプ


   次のページへ      目次ページへ