ニッシー
1990年生まれ
血液型 O型

こんにちは。ITブログアルケーナム管理人のニッシーです。

詳細プロフィールへ

お問い合わせへ






2018-06-16

CASL2のシフト演算の仕方と命令一覧







シフト演算と聞いて、いったいどういう計算なんだろう?と疑問に思いますよね。


シフト演算は、例えば4という値を左に1ビットシフトすると2倍の8に、右に1ビットシフトすると1/2倍の2にする演算方法です。


また、この演算はプログラムを高速化できる優秀な計算方法でもあります。


今回は、シフト演算命令とその計算方法について見てみたいと思います。
















シフト演算命令



シフト演算にも、加算・減算や比較命令と同じように「算術シフト」と「論理シフト」が存在します。



算術左シフト



名称オペコード第1オペランド第2オペランド第3オペランド
Shift
Left
Arithmetic
SLAレジスタアドレス---
レジスタアドレスレジスタ

使用例1: SLA GR0, 1

汎用レジスタGR0のデータを、1ビット左に算術シフトせよ。



使用例2: SLA GR0, 0, GR1

汎用レジスタGR0のデータを、汎用レジスタGR1のデータ+0ビット左に算術シフトせよ。



使用例3: SLA GR0, A, GR1

汎用レジスタGR0のデータを、汎用レジスタGR1のデータ+A番地のアドレス値ビット左に算術シフトせよ。


通常は、使用例1か使用例2のようにしか使用しません。


※ 使用例3で第2オペランドにアドレスを示すラベルAを指定していますが、キ○ガイな動作を展開するので使うのは止めましょう(一応動きます)。



算術右シフト



名称オペコード第1オペランド第2オペランド第3オペランド
Shift
Right
Arithmetic
SRAレジスタアドレス---
レジスタアドレスレジスタ

使用例1: SRA GR0, 1

汎用レジスタGR0のデータを、1ビット右に算術シフトせよ。



使用例2: SRA GR0, 0, GR1

汎用レジスタGR0のデータを、汎用レジスタGR1のデータ+0ビット右に算術シフトせよ。



論理左シフト



名称オペコード第1オペランド第2オペランド第3オペランド
Shift
Left
Logical
SLLレジスタアドレス---
レジスタアドレスレジスタ

使用例1: SLL GR0, 1

汎用レジスタGR0のデータを、1ビット左に論理シフトせよ。



使用例2: SLL GR0, 0, GR1

汎用レジスタGR0のデータを、汎用レジスタGR1のデータ+0ビット左に論理シフトせよ。



論理右シフト



名称オペコード第1オペランド第2オペランド第3オペランド
Shift
Right
Logical
SRLレジスタアドレス---
レジスタアドレスレジスタ

使用例1: SRL GR0, 1

汎用レジスタGR0のデータを、1ビット右に論理シフトせよ。



使用例2: SRL GR0, 0, GR1

汎用レジスタGR0のデータを、汎用レジスタGR1のデータ+0ビット右に論理シフトせよ。





シフト演算とは?



シフト演算とは、2進数で表される数値を右や左にシフトさせて倍数を求めることができる演算方法です。


シフト演算には、「右シフト」「左シフト」という計算方法が2種類存在し、例えば、ある数を右に1ビットシフトすると2倍に、左に1ビットシフトすると1/2倍にすることができます。


右とか左とか、計算と何の関係があるのか、困惑してしまう方もいるかと思いますが、そういうものと割り切ってください。


ここで、シフト演算とはどのような演算か、具体的に見てみましょう。



例1: 2進数(0100)2を、右または左に1ビットシフトすると(0100)2はどうなる?

① 右シフトの場合

0100 --1ビット右シフト--> 0010


答え: (0010)2 = (2)10


右に1ビットシフトすると元の数値の1/2倍になります。


4 / 2 = 2


※ 右シフトの場合、1番右の桁は無くなり、1番左の桁に0を補います。



② 左シフトの場合

0100 --1ビット左シフト--> 1000


答え: (1000)2 = (8)10


左に1ビットシフトすると元の数値の2倍になります。


4 × 2 = 8


※ 左シフトの場合、1番左の桁は無くなり1番右の桁に0を補います。



したがって、右に1ビットシフトした場合1/2倍になり、左なら2倍ということになります。


このように、シフト演算とは、値を左右いずれかにずらすことで、2の倍数の乗算・除算を行うことがでる演算方法になります。











算術シフト・論理シフトの違い



算術シフトと論理シフトの違いは、論理シフトの場合、最上位ビットも含めて全桁がシフトされるのに対し、算術シフトは最上位ビットを含めずに桁がシフトされます。


更にいうと、算術シフトはマイナスの数を扱えるのに対し、論理シフトはマイナスの数を扱えません。


それでは具体的にどのような違いがあるのか見てみましょう。



論理シフトによる演算



例2: GR0の値が(1000 0000 0000 0001)2のとき1ビット左右いずれかに論理シフトするとどうなるか?



① 論理左シフトの場合

1000 0000 0000 0001 --1ビット論理左シフト--> 0000 0000 0000 0010


論理左シフトは、最上位ビットも含めた全ての桁をシフトします。



② 論理右シフトの場合

1000 0000 0000 0001 --1ビット論理右シフト--> 0100 0000 0000 0000


論理右シフトも、最上位ビットも含めた全ての桁をシフトします。



算術シフトによる演算



例3: GR0の値が(1000 0000 0000 0001)2のとき1ビット左右いずれかに算術シフトするとどうなるか?

① 算術左シフトの場合

1000 0000 0000 0001 --1ビット算術左シフト--> 1000 0000 0000 0010


算術左シフトは、最上位ビットを除いた全ての桁をシフトします。




② 算術右シフトの場合

1000 0000 0000 0001 --1ビット算術右シフト--> 1100 0000 0000 0000


算術右シフトは、最上ビットが引き継がれシフトされます。



算術右シフトは最上位ビットが引き継がれる



シフト演算の中でも、算術右シフトは、最上位ビットがシフトする度に連なる形でシフトされていきます。



例4. GR0の値が(1000 0000 0000 0000)2のとき、234ビット算術右シフトするとどうなるか?

【最上位ビットが引き継がれる算術右シフト】
  • 1000 0000 0000 0000 --右に2ビット算術シフト--> 1110 0000 0000 0000
  • 1000 0000 0000 0000 --右に3ビット算術シフト--> 1111 0000 0000 0000
  • 1000 0000 0000 0000 --右に4ビット算術シフト--> 1111 1000 0000 0000


以上のように、最上位ビットの値が次々と引き継がれる形でシフトされます。


なぜ、最上位ビットが右シフトする度に連なるのかというと、算術右シフトの場合、マイナスの数を表現した結果、最上位ビットが次桁に引き継がれているように見える、というのが理由です。


2進数でマイナスの数がどのように表現されているかを理解することで、この謎が解けるはずです。とはいえ、まずは形から入ることで、徐々に理解が追いついてくるため急ぐ必要は全くありません。


以下の「16進数のマイナスの数」の記事は、16進数のマイナスの数について触れた記事ですが、2進数とも大きく関わっているため、興味があれば参考にしてみてください。







最後に



今回は、シフト演算について紹介いたしました。シフト演算とは、要するに2進数を右か左に桁を移動させる計算方法であるといえます。


それでは続きはまた次回にご期待を!














プロフィール

ニッシー
1990年生まれ
血液型 O型

こんにちは。ITブログアルケーナム管理人のニッシーです。

詳細プロフィールへ

お問い合わせへ