CASL U - ビット列の一部を取り出す
 前へ 目次へ 次へ

ビット列の一部を取り出す

 1語の中から連続したビット列の一部を取り出す副プログラムを作成する。
 例えば、4ビットでひとつの数字を表すと1語に4けたの数字が記憶できる。これを処理するときは、4つに分ける必要がある。

 しかし、いつも4ビットずつとは限らない。
 副プログラムでは、第sビットからnビットを取り出せるようにする。下図のように元になるデータ、取り出しの開始ビットsとビット数nをメモリ(GR1番地から)に順に格納して副プログラムに渡す。取り出したビット列はGR0の最下位ビットに詰めて格納する。

←GR0


方法1

 取り出したいビット列の開始ビットsとビット数nから右シフトするビット数を次の式で計算する。
    A = s - n + 1
 元のデータをAビットだけ右シフトする。
 マスクデータを作成する。レジスタに#FFFFを格納する。取り出したいビット数nだけ左シフトして、反転する。例えば、n=3のときは次のようになる。

  1111 1111 1111 1111
    ↓ nビット左シフト
  1111 1111 1111 1000
    ↓ 反転
  0000 0000 0000 0111  ← マスクデータ

 プログラムを次に示す。データは「#0FF0の第7ビットから4ビット分取り出す」ように設定している。

MAIN     START
         LAD     GR1, DATA
         CALL    GETBIT
LAST     ST      GR0, ANS
         RET
DATA     DC      #0FF0, 7, 4  ;データ.
ANS      DS      1
         END
GETBIT   START
         RPUSH
         LD      GR0, 0, GR1    ;元のデータ.
         LD      GR2, 1, GR1    ;開始ビットs
         LD      GR3, 2, GR1    ;移動ビット数n
         SUBA    GR2, GR3       ;S-N
         ADDA    GR2, =1        ;S-N+1
         SRL     GR0, 0, GR2    ;右シフト.
         LAD     GR4, #FFFF     ;マスクデータ作成.
         SLL     GR4, 0, GR3    ;左シフト.
         XOR     GR4, WD        ;反転.
         AND     GR0, GR4       ;マスク.
         RPOP
         RET
WD       DC      #FFFF
         END


方法2

 取り出したいビット列を、いったん、左へシフトしてから右へシフトする。論理シフトの場合、空いたビットには 0 が入るので"方法1"のようにマスクデータを作成してマスク処理をする必要がなくなる。

 左図のように、左シフトするビット数は 15-s 、右シフトするビット数は 16-n でそれぞれ求められる。


 例えば、0101 1111 1010 1100の第9ビットから6ビット取り出す場合を考える。

    0101 1111 1010 1100
        ↓ 6ビット左シフト(15-s=15-9=6)
    1110 1011 0000 0000
        ↓ 10ビット右シフト(16-n=16-6=10)
    0000 0000 0011 1010

 プログラムを次に示す。データは「#0FF0の第7ビットから4ビット分取り出す」ように設定している。

MAIN2    START
         LAD     GR1, DATA
         CALL    GETBIT2
LAST     ST      GR0, ANS
         RET
DATA     DC      #0FF0, 7, 4  ;データ.
ANS      DS      1
         END
GETBIT2  START
         RPUSH
         LD      GR0, 0, GR1    ;元のデータ.
         LAD     GR2, 15        ;左シフト用.
         SUBA    GR2, 1, GR1    ;15-開始ビットS
         SLL     GR0, 0, GR2    ;左シフト.
         LAD     GR3, 16        ;右シフト用.
         SUBA    GR3, 2, GR1    ;16-移動ビット数N
         SRL     GR0, 0, GR3    ;右シフト.
         RPOP
         RET
         END


課題1 元のデータ、取り出す開始ビットsとビット数nをメモリに格納し、その先頭アドレスをGR1に格納して副プログラムに渡し、取り出したビット列をGR0の最下位ビットに詰めて格納し、空いたビットには元のデータが格納されるようにする。
 レジスタの値は副プログラム呼び出し前と変わらないようにすること。

方法2を使った例


 前へ 目次へ 次へ
 CASL U Copyright © 2003,2017  Hiroshi Masuda

 

 

inserted by FC2 system