PICの巡回シフト命令の使い方

A)巡回シフト命令


【巡回シフト命令】

8ビットのデータをビット単位でシフトする命令で、RLF f,d、と
RRF f,dがこれに相当します。
また類似の命令にSWAPF f,d命令があります。

nemonic  : 内容       :Flag :Cycle :オペコード
--------------------------------------------------------------
RLF f,d  : 左回転      : C  : 1  : 00 1101 dfff ffff
      f<n> -> d<n+1> f<7> -> C C -> d<0>

RRF f,d  : 右回転      : C  : 1  : 00 1100 dfff ffff
      f<n> -> d<n-1> f<0> -> C C -> d<7>


RLF、RRF命令は図2(a)の構造です。


【巡回シフト命令の動作】

実際の命令の実行がどのようになされるかを、図1で説明します。

(1)命令のフェッチ
 プログラムカウンタでアドレスされたプログラムメモリ内の命令が、
 命令レジスタに呼び出されます。
(2)命令の解読実行
 命令レジスタに行くと、命令コードが解読され命令の動作が実行
 されます。
(3)
 命令レジスタに行くと、レジスタファイのf番地が指定され、データバス
経由ALUに送られます。
(4)演算の実行
 ALUの中で実際の処理が実行され、RLFの時は1ビット左へ、RRFの
 時は1ビット右へずらしたデータがALUの出力に作られます。
 その出力データはd=0ならWregへ、d=1ならfレジスタへ上書きされます。
 
 また fレジスタのいずれかの端のデータは、シフト動作のとき、STATUS
 のキャリーフラグが使われて残されます。
 つまり、シフトのとき空くビットには現在のキャリーフラグが移され、
 はみ出すビットはキャリーフラグへ移されます。


【巡回シフト命令の使い方】

実際のシフト命令の動作は下図のようになります。下図から判るように
シフト命令を使うときには、STATUSレジスタにある、Carryビットが
0か1かを意識しておくことが必要です。




 (実際の例)
   ・DATAを1/4倍する。

      BCF  STATUS,C  ;Carry Bitをクリア
      RRF  DATA,F   ;DATAを1/2倍
      BCF  STATUS,C  ;Carryをクリア
      RRF  DATA,F   ;DATAをさらに1/2倍


B)スワップ命令


【スワップ命令】

スワップ命令は一寸特殊な命令で、指定したレジスタの上位4ビットと
下位4ビットを入れ替える動作をします。

nemonic  : 内容       :Flag :Cycle :オペコード
--------------------------------------------------------------
SWAPF f,d : f<0:3> -> d<4:7>, : None: 1  : 00 1110 dfff ffff
      f<4:7> -> d<0:3>

【スワップ命令の動作】

SAWPF命令はシフトとは一寸異なりますが、やはり図2(a)の構造で、
fレジスタの内容の上位4ビットと下位4ビットの入れ替えをして、結果を
dビットの内容により、Wregかfレジスタに上書きします。
この命令では、STATUSレジスタは影響を受けません。

【スワップ命令の使い方】

SWAP命令を有効に使う例は、下記のような場合です。

例1 割り込み時のレジスタの待避、復帰
    SWAP命令がSTATUSに影響しないことを利用しています。

PUSH  MOVWF  W_TEMP    ;Wレジスタ待避
    SWAPF  STATUS,W  ;STATUS取り出し
    MOVWF  ST_TEMP   ;STATUS待避


POP   SWAPF  ST_TEMP,W  ;STATUSを戻す
    MOVWF  STATUS   ;
    SWAPF  W_TEMP,F  ;Wレジスタを戻す
    SWAPF  W_TEMP,W


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