←練習問題へ :  INDEX :  次ページへ→


シフト演算


  シフト演算とは論理演算と同じようにビットを操作する命令である。具体的には、 2進数の各ビットをずらすことである。ローテート命令は循環(回転)させる命令である。

6-1. シフト ( Shift )

  シフト命令は上で説明したように、ビットをずらす命令である。左にずらすか、右にずらすか、ずらすデータが符号付き整数か、符号なし整数(もしくは数値以外のデータ)かによって4種類のソフト命令が用意されている。

  まず、符号なし整数(もしくは数値以外のデータ)のシフト命令について説明する。これらは論理シフトと言い、ずらしてはみ出す1桁はキャリーフラグ(CF)に格納される。足りなくなる1桁には無条件に0が入る(下図参照)。

SHR ( Shift Logical Right ) :論理的右シフト

SHL ( Shift Logical Left ) :論理的左シフト

SHR	DEST,Count
SHL	DEST,Count

   動作:別途解説
  影響を受けるフラグ:OF(Count=1の場合のみ結果を反映),
                        SF,ZF,PF(結果を反映),
                        CF:別途解説
    DEST  :レジスタ、メモリー
    Count :CL、即値(8bit以下)
   シフト命令はCount(CLまたは8bitの符号なし整数で表せる範囲の即値)で指定した分だけ、上述のシフトを行う。CFには、はみ出した桁が格納されるが、Countの値がDESTのサイズを越えた場合(「SHR AX,17」など)は、CFの値は未定である。上のニーモニックにも示したが、 OFはCount=1nの時のみ結果を反映するが、Count=1の時もOFを見て何かするようなことはあまりない。

  次に、符号付き整数のシフトを説明する。符号付き整数は、上位1bitが符号を表している。この符号を壊さないようにシフトさせる(下図参照)。この理由は後述する。

  上図のようにSHLとSALは同じ働きをする。しかしSARはSALと異なり、上位1bitには0が入るのではなく、ずらす前の値がそのまま残る。

SAR ( Shift Arithmetic Right ) :算術的右シフト

SAL ( Shift Arithmetic Left ) :算術的左シフト

SAR	DEST,Count
SAL	DEST,Count

   動作:別途解説
  影響を受けるフラグ:OF(Count=1の場合のみ結果を反映),
                        SF,ZF,PF(結果を反映),
                        CF:別途解説
    DEST  :レジスタ、メモリー
    Count :CL、即値(8bit以下)

さて、シフトを行うとデータはどうなるのだろうか?まず、左にずらした時(SAL, SHL)の例を示す。


このように左にずらすと、その値は2倍になる。

  次に、8bitの128を右にずらすことを考える。8bitの128は符号付き整数で考えると -128である。この両者をSHRとSARでシフトさせると下図のようになる。


右にずらす場合、SHRとSARでこのような差がでる。もし符号付き整数の-128を「SHR」で右にずらすと、-128→+64となる。これを「SAR」でずらすと-128→-64となり、1/2になる。このようにその値が符号付き整数の場合は「SAR」を使い、それ以外の場合は「SHR」を使うように、使い分ける必要がある。

←練習問題へ :  INDEX :  次ページへ→