【移動命令の種類】
指定したレジスタへデータをコピーする命令です。
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 ;違うときの処理へジャンプ