シフト命令は左と右のシフトが存在し、それぞれで算術シフトと論理シフトが存在します。
シフト命令によってレジスタを飛び出たビットはOF(Overflow Flag)に設定されます。
他のフラグは通常通りの変化(演算結果の最上位ビットが1になるとSFが1、全ビットが0でZFが1)です。
算術シフトと論理シフトの大きな違いは、最上位ビットの取り扱いで、
論理シフトは、最上位ビットを含めた全てがシフトします。
対して算術シフトは最上位ビットがシフトの対象になりません。つまり
左右のシフトで符号ビットは変化しないことです。
そして右のシフト時は、空いた空間(符号ビットより下位のビット)は符号ビットと同じ値で埋まるように作られています。
以下で、各種シフト演算を実験しましょう(各ビットの変化を確認)
オペランドに指定したビット数だけレジスタ全体のビットを右にシフトします。
右にシフトすることで、空いた左のビットには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倍しています。
上記のコードをアセンブラエディタに設定するボタン→
オペランドに指定したビット数だけレジスタの最上位ビットを除いた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
上記のコードをアセンブラエディタに設定するボタン→
オペランドに指定したビット数だけレジスタ全体のビットを左にシフトします。
左にシフトすることで、空いた右のビットには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
上記のコードをアセンブラエディタに設定するボタン→
オペランドに指定したビット数だけレジスタの最上位ビットを除いた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
上記のコードをアセンブラエディタに設定するボタン→