【巡回シフト命令】
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倍
【スワップ命令】
スワップ命令は一寸特殊な命令で、指定したレジスタの上位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