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の最下位ビットに詰めて格納し、空いたビットには元のデータが格納されるようにする。
レジスタの値は副プログラム呼び出し前と変わらないようにすること。
CASL U | Copyright © 2003,2017 Hiroshi Masuda |