Subsections

2 シフト命令

2.1 シフト(基数Nの場合)

10進数を10倍,100倍,1000倍,$ \cdots$ するのは簡単である.$ 10^{n}$ 倍するためには, 左にゼロを$ n$ 個付ければ良い.これは,左シフトである.同様に$ 1/10$ 倍,$ 1/100$ 倍, $ 1/1000$ 倍,$ \cdots$ するのは簡単である.$ 10^{-n}$ 倍するためには,小数点の位置を $ n$ 個左に寄せれば良い.これは右シフトである.

16進数の場合も同じである.たとえば,$ (EF35)$ $ (16)_{10}=(10)_{16}$ 倍や $ (16^2)_{10}=(10^2)_{16}$ 倍, $ (16^{-1})_{10}=(10^{-1})_{16}$ 倍や $ (16^{-2})_{10}=(10^{-2})_{16}$ 倍すると

\begin{equation*}\begin{aligned}(EF35)_{16}\times(16^2)_{10}&=(EF35)_{16}\times(...
...0}&=(EF35)_{16}\times(0.01)_{16} &=(EF.35)_{16} \end{aligned}\end{equation*}

となる.やはり,右や左にシフトさせれば良い.

2進数の場合も全く同じである.この場合,$ 2^{n}$ の計算が簡単である.$ n$ が正の整数 の場合,左に$ n$ ビットシフトさせる.一方,$ n$ が負の整数の場合,$ n$ の絶対値分,右 にシフトさせる.

\begin{equation*}\begin{aligned}(110011)_{2}\times(2^2)_{10}&=(110011)_{2}\times...
...}&=(110011)_{2}\times(0.01)_{2} &=(1100.11)_{2} \end{aligned}\end{equation*}

2.2 CASL IIの場合

2.2.1 ビットシフト

CASL IIで取り扱う16ビットの整数を$ 2^n$ 倍する事を考える.もし,その16ビットが正 で有れば,それは簡単である.先に示したように,$ n$ ビット右や左にシフトさせれば良 い.

問題は,符号付き整数で,第15ビットが1の負の場合である.これは,実例を示した方が 分かりやすい.たとえば, $ (-12)_{10}$ を2倍と4倍する事を考える.2倍すると $ (-24)_{10}$ で,4倍すると $ (-48)_{10}$ である.それぞれを,2の補数で取り扱うと, となる.

$\displaystyle (-12)_{10}$ $\displaystyle \rightarrow(1111\; 1111\; 1111\; 0100)$    
$\displaystyle (-24)_{10}$ $\displaystyle \rightarrow(1111\; 1111\; 1110\; 1000)$    
$\displaystyle (-48)_{10}$ $\displaystyle \rightarrow(1111\; 1111\; 1101\; 0000)$    

従って,CASL IIの符号付き16ビット整数の場合,$ 2^n$ する場合は,左に$ n$ ビットシフ トさせて,空いたビットに0を入れれば良い.

次に,1/2倍と1/4倍する事を考える.すると

$\displaystyle (-12)_{10}$ $\displaystyle \rightarrow(1111\; 1111\; 1111\; 0100)$    
$\displaystyle (-6)_{10}$ $\displaystyle \rightarrow(1111\; 1111\; 1111\; 1010)$    
$\displaystyle (-3)_{10}$ $\displaystyle \rightarrow(1111\; 1111\; 1111\; 1101)$    

となる.この場合も右に$ n$ ビットシフトさせれば良いのであるが,空いたビットには1を 入れなくてはならない.
[
l]ポイント
  • 符号無し整数の場合
    • $ 2^n$ 倍する場合,左に$ n$ ビットシフトさせて,空いたビットに0 を入れればよい.
    • $ 2^{-n}$ 倍する場合,右に$ n$ ビットシフトさせて,空いたビットに0 を入れればよい.
  • 符号付き整数の場合
    • $ 2^n$ 倍する場合,左に$ n$ ビットシフトさせて,空いたビットに0を入れればよい.
    • $ 2^{-n}$ 倍する場合,右に$ n$ ビットシフトさせて,空いたビットには符号ビッ トを入れればよい.

2.2.2 端数の処理

CASL IIの整数をビットシフトを用いて2で割ったりすると,端数(小数部)が生じる.この 端数は,16ビットを越えるので,無視される.ここで,商が切り上げなのか切り下げなの か,疑問が発生する.これについても,実際の整数で考える.

$ (5)_{10}$$ (-5)_{10}$ を1ビット右にシフトさせて,1/2倍してみる.

$\displaystyle (5)_{10}$ $\displaystyle \rightarrow(0000\; 0000\; 0000\; 0101)$    
  1ビット右$\displaystyle \rightarrow(0000\; 0000\; 0000\; 0010)\rightarrow(2)_{10}$    
$\displaystyle (-5)_{10}$ $\displaystyle \rightarrow(1111\; 1111\; 1111\; 1011)$    
  1ビット右$\displaystyle \rightarrow(1111\;1111\; 1111\; 1101)\rightarrow(-3)_{10}$    

この結果から,以下のようにまとめることができる.
[
l]ポイント
  • 正の整数の場合,端数は切り下げとなる.
  • 負の整数の場合,端数は切り上げとなる.

2.3 算術シフト命令

算術シフト命令は,左シフト(SLA)と右シフト(SRA)の2つがある.いずれも,符号付き整 数を取り扱い,前者は$ 2^n$ 倍,後者は$ 2^{-n}$ 倍する.算術シフト命令は,符号も考慮 していることが重要である.

2.3.1 算術左シフト(SLA)

2.3.1.1 内容

命令語 SLA
語源 Shift Left Arithmetic (shift:移す left:左 arithmetic:算術)
役割 レジスタの内容をnビット左に移動させる.空いたビットには,0 が入る. これは,符号付き整数を$ 2^n$ 倍しているのと同じ.
書式 教科書(p.59)の通り.第一オペランドは汎用レジスター.第二オ ペランドはアドレス.
機能 教科書(p.59)の通り
フラグレジスタ 教科書(p.59)の通り.

この命令は,符号付き整数を$ 2^{n}$ 倍する.従って,シフトにより空いたビットには,0 が入る.

2.3.1.2 使用例

      SLA   GR0,2        ;GR0の内容を2ビット左へシフト
      SLA   GR0,0,GR1    ;GR0の内容をGR1の値,左へシフト

2.3.2 算術右シフト(SRA)

2.3.2.1 内容

命令語 SRA
語源 Shift Right Arithmetic (shift:移す right:右 arithmetic:算術)
役割 レジスタの内容をnビット右に移動させる. 空いたビットには, 符号ビットが入る.これは,符号付き整数を$ 2^{-n}$ 倍しているのと同じ.
書式 教科書(p.62)の通り.第一オペランドは汎用レジスター.第二オ ペランドはアドレス.
機能 教科書(p.62)の通り
フラグレジスタ 教科書(p.62)の通り.

この命令は,符号付き整数を$ 2^{-n}$ 倍する.従って,シフトにより空いたビットには, 符号ビットが入る.

2.3.2.2 使用例

      SRA   GR0,2        ;GR0の内容を2ビット右へシフト
      SRA   GR0,0,GR1    ;GR0の内容をGR1の値,右へシフト

2.4 論理シフト命令

論理シフト命令は,左シフト(SLL)と右シフト(SRL)の2つがある.いずれも,符号無し整 数を取り扱い,前者は$ 2^n$ 倍,後者は$ 2^{-n}$ 倍する.論理シフト命令は,符号は考慮 していない.

2.4.1 論理左シフト(SLL)

2.4.1.1 内容

命令語 SLL
語源 Shift Left Logical (shift:移す left:左 logical:論理上の)
役割 レジスタの内容をnビット左に移動させる.空いたビットには, 0が入る.これは,符号無し整数を$ 2^n$ 倍しているのと同じ.
書式 教科書(p.65)の通り.第一オペランドは汎用レジスター.第二オ ペランドはアドレス.
機能 教科書(p.65)の通り
フラグレジスタ 教科書(p.65)の通り.

この命令は,符号無し整数を$ 2^{n}$ 倍する.従って,シフトにより空いたビットには,0 が入る.

2.4.1.2 使用例

      SLL   GR0,2        ;GR0の内容を2ビット左へシフト
      SLL   GR0,0,GR1    ;GR0の内容をGR1の値,左へシフト

2.4.2 論理右シフト(SRL)

2.4.2.1 内容

命令語 SRL
語源 Shift Right Logical (shift:移す right:右 logical:論理上の)
役割 レジスタの内容をnビット右に移動させる.空いたビットには, 0が入る.これは,符号付き整数を$ 2^{-n}$ 倍しているのと同じ.
書式 教科書(p.67)の通り.第一オペランドは汎用レジスター.第二オ ペランドはアドレス.
機能 教科書(p.67)の通り
フラグレジスタ 教科書(p.67-68)の通り.

この命令は,符号無し整数を$ 2^{-n}$ 倍する.従って,シフトにより空いたビットには, 符号ビットが入る.

2.4.2.2 使用例

      SRL   GR0,2        ;GR0の内容を2ビット右へシフト
      SRL   GR0,0,GR1    ;GR0の内容をGR1の値,右へシフト

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
2006-01-29


no counter