シフト命令

シフト命令は左と右のシフトが存在し、それぞれで算術シフトと論理シフトが存在します。
シフト命令によってレジスタを飛び出たビットはOF(Overflow Flag)に設定されます。
他のフラグは通常通りの変化(演算結果の最上位ビットが1になるとSFが1、全ビットが0でZFが1)です。
算術シフトと論理シフトの大きな違いは、最上位ビットの取り扱いで、 論理シフトは、最上位ビットを含めた全てがシフトします。
対して算術シフトは最上位ビットがシフトの対象になりません。つまり 左右のシフトで符号ビットは変化しないことです。 そして右のシフト時は、空いた空間(符号ビットより下位のビット)は符号ビットと同じ値で埋まるように作られています。

以下で、各種シフト演算を実験しましょう(各ビットの変化を確認)

SRL 論理右シフト演算

オペランドに指定したビット数だけレジスタ全体のビットを右にシフトします。
右にシフトすることで、空いた左のビットには0が入ります。
シフト数の指定は、数値や、数値と指標レジスタの組み合わせで指定できます。 このオペランドの指定は、分類的にLADや各種ジャンプ命令、PUSH命令と同じです。)
  すなわち、SRL  GR1, 1, GR2 は、1+GR2の加算結果がシフト量になります。 そしてシフト処理ではみでた最後のビットがOF(overflow flag)に残ります。 他のフラグは通常通りの変化(演算結果の最上位ビットが1になるとSFが1、全ビットが0でZFが1)になります。
なお、右へ1ビットシフトすることは 1/2の値にすることを意味し、
   右へ2ビットシフトすることは 1/4の値にすることを意味する。
以下では、3ビットだけビットが右にシフトしているので1/8倍しています。

上記のコードをアセンブラエディタに設定するボタン→

SRA 算術右シフト演算

オペランドに指定したビット数だけレジスタの最上位ビットを除いたb14からb0の範囲のビットを右にシフトします。
右にシフトすることで、空いた左のビットには最上位ビットと同じbitが入ります。
つまり、シフトで符号ビットは変化しないわけです。 この細工によって符号が付いても、右への1ビットシフトで1/2にでき、右への2ビットシフトで1/4になります。
また、シフト処理ではみでた最後のビットがOF(overflow flag)に設定されます。

TEST	START   MAIN

MAIN 	NOP
	LAD	GR0,#D555
	LAD	GR1,3
	SRA	GR0,0,GR1
	SRA	GR0,1
	SRA	GR0,1
	AND	GR0, =#7FFF ;最上位ビットを0にする。
	SRA	GR0,1
	RET
	END

上記のコードをアセンブラエディタに設定するボタン→

SLL 論理左シフト演算

オペランドに指定したビット数だけレジスタ全体のビットを左にシフトします。
左にシフトすることで、空いた右のビットには0が入ります。
シフト処理ではみでた最後のビットがOF(overflow flag)に残ります。 他のフラグは通常通りの変化(演算結果の最上位ビットが1になるとSFが1、全ビットが0でZFが1)になります。
なお、左へ1ビットシフトすることは 2倍の値にすることを意味し、
   左へ2ビットシフトすることは 4倍の値にすることを意味する。
以下の最初のシフトでは、3ビットだけビットが左にシフトしているので8倍しています。

TEST	START   MAIN

MAIN 	NOP
	LAD	GR0,#1555
	LAD	GR1,3
	SLL	GR0,0,GR1
	SLL	GR0,1
	SLL	GR0,1

	RET

	END

上記のコードをアセンブラエディタに設定するボタン→

SLA 算術左シフト演算

オペランドに指定したビット数だけレジスタの最上位ビットを除いたb14からb0の範囲のビットを左にシフトします。
左にシフトすることで、空いた右のビットには0が入ります。
最上位ビットはシフト対象になりません。(最上位ビットは変化しません。) この細工によって符号が付いても、左への1ビットシフトで2倍にでき、左への2ビットシフトで4倍になります。
また、14ビット目からはみでた最後のビットがOF(overflow flag)に残ります。

TEST	START   MAIN

MAIN 	NOP
	LAD	GR0,#1555
	LAD	GR1,3
	SLA	GR0,0,GR1
	SLA	GR0,1
	SLA	GR0,1
	OR	GR0, =#8000 ;最上位bitを1にする。
	SLA	GR0,1
	RET
	END

上記のコードをアセンブラエディタに設定するボタン→