close

平成31年度 春期 基本情報技術者試験 午後 問12 詳細解説


基本情報技術者試験(FE)過去問題

ビット列に対する操作、複数のアドレスにまたがるビット列を指定し、所定の処理を行うプログラムです。

プログラム1は連続した3語に「ビット領域の先頭アドレス」「対象ビット列のビット位置」「対象ビット列のビット長」をこの順に格納して、その3語の先頭アドレスをGR1に設定して呼び出します。つまりGR1が指し示すアドレスに「ビット領域の先頭アドレス」が格納されていて、GR1+1のアドレスに「対象ビット列のビット位置」、GR1+2のアドレスに「対象ビット列のビット長」がそれぞれ格納されていることになります。

問1

プログラム1は対象ビット列の全ビットを1にするプログラムです。

BITSON

START

RPUSH

LD GR3,1,GR1
1とGR1を足した実効アドレスに格納されているデータをGR3に格納する。FRのOFが0になる

;ビット位置を、相対アドレス(GR2)とビットインデックス(GR3)とに変換。


LD GR2,GR3

[a]

AND GR3,=#000F
GR3と16進数000Fとの論理積をとりその結果をGR3に格納する。OF には 0 が設定される。

LD GR4,2,GR1
2とGR1を足した実効アドレスに格納されているデータをGR3に格納する。FRのOFが0になる;GR4:ビット長(初期値)

(GR1+1)に格納されているビット位置から、相対アドレスとビットインデックスを計算します。相対アドレスはGR2、ビットインデックスはGR3に格納します。

図1を見ると、ビット位置を16(=BITSPW)で割った時の余りがビットインデックス、商が相対アドレスだとわかります。16=24なので右側に4ビットシフトすると16で割ったことと同じになります。

ビットインデックスは「AND GR3,=#000F」で計算してあります。なので相対アドレスは[a]で計算しているとわかります。ビット位置はGR3とGR2にも格納されているので、GR2を4ビット右シフトすればいいのでaは「SRL GR2,4」となります。GR4には(GR+2)に格納されているビット長が格納されます。

;(ビットインデックス+ビット長)≧16の間、ビット操作を行う。

LOOP

LD GR0,GR4
GR4に格納されているデータをGR0に格納する。FRのOFが0になる。

ADDL GR0,GR3
GR0とGR3を符号なしの数として足した値をGR0に格納する。

CPL GR0,BITSPW
GR0とBITSPWに格納されている値を符号なしの値として比較を行いその結果によってFRの値が変わる。OF には 0 が設定される。

JMI BREAK
SF=0の時、BREAKに分岐する。分岐しないときは,次の命令に進む

GR0にはGR4+GR3、ビットインデックス+ビット長が格納されています。GR0が16より大きければ1語に収まらずに次の語にまたがります。GR0と16(=BITSPW)を比較をすることで1語に収まるかを判定しています。JMI命令でGR0<16ならBREAKに分岐します。

LD GR5,BITSPW
BITSPWに格納されているデータをGR5に格納する。FRのOFが0になる。;GR5:語内で対象となるビット数

LD GR3,GR3
GR3に格納されているデータをGR3に格納する。FRのOFが0になる。

JZE FULL
ZF=1の時、FULLに分岐す る。分岐しないときは,次の命令に進む。

「LD GR3,GR3」ではGR3の値自体は変わりませんがFRの値は変わります。次のJZE命令でZF=1の時に分岐します。GR3=0の時はZF=1になるので、GR3=0の時にFULLに分岐します。

[b]

SUBL GR3,GR3
GR3とGR3を符号なしの数として引いた値をGR3に格納する。;GR3←0

FULL

SUBL GR4,GR5
GR4とGR5を符号なしの数として引いた値をGR4に格納する。;操作するビット数だけビット長を減らす。

注釈からビット長(GR4)からGR5を引いて操作するビットに変換しているとわかります。GR5は一回目のループだと「LD GR5,BITSPW」で16になっています。それ以降は[b]以外で変化している命令はありません。なので[b]で操作するビット数を計算しているはずです。ビットインデックス0の時操作するビット数は16、ビットインデックスnの時操作するビット数は16−nになります。なのでbは「SUBL GR5,GR3」になります。

プログラム2を呼び出すとき、GR0はビットマスクの値、GR1はビット領域の先頭アドレスを格納した語のアドレス、GR2捜査の対象となる語への相対アドレスを設定します。GR1とGR2はそのまま使えるのでGR0の設定を行います。

LD GR0,=1
1をGR0に格納する。FRのOFが0になる。

SLL GR0,0,GR5
符号を含みGR0をGR5で指定し たビット数だけ左にシフトする。 シフトの結果,空いたビット位置には 0 が入る。OF にはレジスタから最後に送り出 されたビットの値が設定される。

SUBL GR0,=1
GR0と1を符号なしの数として引いたものをGR0に格納する。;GR0:ビットマスク

この一連の命令でGR0がビットマスク(対象となるビットが1、それ以外が0)になっています。例:GR0←00000001、(3ビットシフト)00001000、00001000-1=00000111。

CALL SETOP
SPの値を符号なしの値として-1してSPに格納し、PRの値をSPが指し示すアドレスに格納し、SETOPをPRに格納する。

ADDL GR2,=1
GR2と1を符号なしの数として足したものをGR2に格納する。;次の語の相対アドレス

JUMP LOOP
無条件にLOOPに分岐する。

相対アドレスを+1し、(ビットインデックス+ビット長)<16になるまでビット操作を行います。

BREAK

GR0<16

LD GR4,GR4
GR4に格納されているデータをGR4に格納する。FRのOFが0になる。;操作の対象になる未処理のビット有り?

[c]

[c]にはGR4=0の場合の処理になります。対象ビット長が0であれば処理は終わりなので終了します。なのでCの答えは「JZE FIN」になります。

;未捜査のビット数分の右詰めのビットマスクを生成し、必要なビット数だけ左へシフト

LD GR0,=1
1をGR0に格納する。FRのOFが0になる。

SLL GR0,0,GR4
符号を含みGR0をGR4で指定し たビット数だけ左にシフトする。 シフトの結果,空いたビット位置には 0 が入る。OF にはレジスタから最後に送り出 されたビットの値が設定される。

SUBL GR0,=1
GR0と実効アドレス1に格納されている値を符号なしの数として引いたものをGR0に格納する。

LD GR5,BITSPW
BITSPWに格納されているデータをGR0に格納する。FRのOFが0になる。

SUBL GR5,GR3
GR5とGR3に格納されている値を符号なしの数として引いたものをGR5に格納する。

[d]

SLL GR0,0,GR5
符号を含みGR0をGR5で指定し たビット数だけ左にシフトする。 シフトの結果,空いたビット位置には 0 が入る。OF にはレジスタから最後に送り出 されたビットの値が設定される。;GR0:ビットマスク

今回は左詰めのビットマップを生成します。未操作のビット数がGR4、右詰めのビットマップ(GR4の桁分の1が並ぶ)を左詰めにするには16(=BITSPW)-GR4ビット左シフトすればいいことがわかります。なのでdの答えは「SUBL GR5,GR4」になります。

CALL SETOP
SPの値を符号なしの値として-1してSPに格納し、PRの値をSPが指し示すアドレスに格納し、SETOPをPRに格納する。

FIN

RPOP

RET

BITSPW

DC 16
定数定義。;一語のビット数

END

SETOP

START

RPUSH

LD GR3,0,GR1

ADDL GR3,GR2

OR GR0,0,GR3

ST GR0,0,GR3

RPOP

RET

END

問2

プログラム3は既存の副プログラムSETOPのアドレスをGR7に設定して変更後のプログラム1を呼び出す「CALL BITSOP」ので、eの答えは「BITSOP」になります。

プログラム1の行番号24と38は「CALL SETOP」です。既存の副プログラムSETOPのアドレスをGR7に設定しているのでfの答えは「0,GR7」になります。

科学の部屋[工学・化学]