基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成31年 春期 基本情報技術者 午後 問12
問12   CASL

 次のアセンブラプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

 

〔プログラムの説明〕

 主記憶上の連続した語から成る領域(以下,ビット領域という)内において, 指定されたビット列(以下,対象ビット列という)に対する操作を行うための副プログラム群である。

 対象ビット列は,連続したビットの並びであり,開始位置(以下,ビット位置という)と ビット数(以下,ビット長という)で表す。ビット位置は,ビット領域全体を 連続したビット列と捉えて,ビット領域の最初の語の最上位ビットを 0 ビット目としたときの 相対位置である。対象ビット列はビット領域内に収まるものとする。

 図1に,ビット領域及び対象ビット列(網掛け部分)の例を示す。ビット位置が 44 でビット長が 24 の場合,ビット領域の最初の語を 0 語目としたとき, 対象ビット列の最初のビットを含む語は,2 語目なので,これを相対アドレス 2 と表す。 対象ビット列の最初のビットは,相対アドレス 2 の語の最上位ビットを 0 ビット目としたとき, 12 ビット目なので,この位置をビットインデックス 12 と表す。対象ビット列の最後のビットの位置を, 相対アドレス 4 の語のビットインデックス 3 と表す。

 

図1 ビット領域及び対象ビット列の例

 

(1) プログラム1は,対象ビット列の全ビットを 1 にする副プログラム BITSON である。 主プログラムは,連続した 3 語に,ビット領域の先頭アドレス,対象ビット列のビット位置, 及び対象ビット列のビット長をこの順に格納して,その 3 語の先頭アドレスを GR1 に設定して呼び出す。 ビット位置及びビット長は,符号のない数値である。ビット長が 0 の場合は, 対象ビット列に対する操作は行わない。

(2) プログラム2は,GRØ で与えるビットマスクの値とビット領域内で操作の対象となる 1 語の 値との論理和を求め,結果を同じ語に格納する副プログラム SETOP である。 GRØ に 1 語内のビット操作の対象となるビットを 1 で表すビットマスクを, GR1 にビット領域の先頭アドレスを格納した語のアドレスを,GR2 に操作の対象となる語への 相対アドレスを設定して,呼び出される。

(3) 副プログラムから戻るとき,汎用レジスタ GR1 〜 GR7 の内容は元に戻す。

 

〔プログラム1〕

(行番号)
 1 BITSON   START
 2          RPUSH
 3          LD     GR3,1,GR1     ; GR3: ビット位置
 4 ; ビット位置を,相対アドレス (GR2) と
 5 ; ビットインデックス (GR3) とに変換
 6          LD     GR2,GR3
 7          
 8          AND    GR3,=#ØØØF
 9          LD     GR4,2,GR1     ; GR4: ビット長(初期値)
1Ø ; (ビットインデックス + ビット長)≧ 16 の間,ビット操作を行う
11 LOOP     LD     GRØ,GR4
12          ADDL   GRØ,GR3
13          CPL    GRØ,BITSPW
14          JMI    BREAK
15          LD     GR5,BITSPW    ; GR5: 語内で対象となるビット数
16          LD     GR3,GR3
17          JZE    FULL
18          
19          SUBL   GR3,GR3       ; GR3 ← Ø
2Ø FULL     SUBL   GR4,GR5       ; 操作するビット数だけビット長を減らす
21          LD     GRØ,=1
22          SLL    GRØ,Ø,GR5
23          SUBL   GRØ,=1        ; GRØ: ビットマスク
24          CALL   SETOP
25          ADDL   GR2,=1        ; GR2: 次の語の相対アドレス
26          JUMP   LOOP
27 BREAK    LD     GR4,GR4       ; 操作の対象になる未処理のビットあり?
28          
29 ; 未操作のビット数分の右詰めのビットマスクを生成し,
3Ø ; 必要なビット数だけ左ヘシフト
31          LD     GRØ,=1
32          SLL    GRØ,Ø,GR4
33          SUBL   GRØ,=1
34          LD     GR5,BITSPW
35          SUBL   GR5,GR3
36          
37          SLL    GRØ,Ø,GR5     ; GRØ: ビットマスク
38          CALL   SETOP
39 FIN      RPOP
4Ø          RET
41 BITSPW   DC     16            ; 1 語のビット数
42          END

 

〔プログラム2〕

(行番号)
 1 SETOP   START
 2         RPUSH
 3         LD     GR3,Ø,GR1
 4         ADDL   GR3,GR2
 5         OR     GRØ,Ø,GR3
 6         ST     GRØ,Ø,GR3
 7         RPOP
 8         RET
 9         END

 

設問1  プログラム中の に入れる正しい答えを,解答群の中から選べ。

 

a に関する解答群 ア SLL  GR2,Ø,GR3       イ SLL  GR2,4      ウ SLL  GR2,4,GR3

エ SRL  GR2,Ø,GR3       オ SRL  GR2,4      カ SRL  GR2,4,GR3

 

b,d に関する解答群 ア ADDL  GR5,GR2      イ ADDL  GR5,GR3      ウ ADDL  GR5,GR4

エ SUBL  GR5,GR2      オ SUBL  GR5,GR3      カ SUBL  GR5,GR4

 

c に関する解答群 ア JNZ  FIN       イ JNZ  LOOP       ウ JPL  FIN

エ JPL  LOOP      オ JZE  FIN      カ JZE  LOOP

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

 

設問2  次の記述中の に入れる正しい答えを,解答群の中から選べ。

 

 対象ビット列の全ビットを 0 にする副プログラムを新規に作成することを考える。

 ビット領域内の操作の対象になる語の相対アドレスやビットインデックスを求める処理などは, プログラム1で実装されている。そこで,新規の副プログラムを作成する前に, 既存の副プログラム群を再編成し,対象ビット列の全ビットを 1 にする副プログラム及び 0 にする副プログラムが,プログラム1の処理を利用できるようにする。

 プログラム1に変更を加え,それに伴つて副プログラム BITSON を, その仕様は変更せずに再実装する方法を,次の (1)〜(3) に示す。

 

(1) 次に示すプログラム3を新たな副プログラム BITSON(以下,新 BITSON という)とする。 新 BITSON は,既存の副プログラム SETOP のアドレスを GR7 に設定して変更後のプログラム1を呼び出す。

 

〔プログラム3〕
(行番号)
 1 BITSON   START
 2          RPUSH
 3          LAD    GR7,SETOP
 4          CALL   BITSOP
 5          RPOP
 6          RET
 7          END

(2) プログラム1の入口名を変更するために,行番号1のラベルを にする。

(3) プログラム1の行番号 24 と行番号 38 の CALL 命令のオペランドを に変更する。

 

 このように,既存の副プログラム群を再編成した後に,対象ビット列の全ビットを 0 にする処理の ための副プログラム BITSOFF(プログラムは省略)と,それが変更後のプログラム1を 介して呼び出す副プログラム RESETOP(プログラムは省略)を作成する。 二つの副プログラムの概要を,次の (1),(2) に示す。

 

(1) 副プログラム BITSOFFは,新 BITSON と同様に,副プログラム RESETOP の アドレスを GR7 に設定して副プログラム BITSOP を呼び出す。

(2) 副プログラム RESETOP は,副プログラム SETOP と同様のインタフェースで呼び出される。 GRØ には,1 語内でビット操作の対象になるビットを表すビットマスクが設定されているので, GRØ の全ビットについて 0 と 1 を反転させた値と,GR1 と GR2 とで指定された語の値との論理積を求め, 結果を同じ語に格納する。

 

e に関する解答群 ア BITSON       イ BITSOP       ウ SETOP

 

f に関する解答群 ア Ø,GR5        イ BITSON,GR5      ウ Ø,GR6

エ BITSON,GR6      オ Ø,GR7       カ BITSON,GR7

解答 e ←クリックすると正解が表示されます

解答 f ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]