メモリーリークを修正
[YACASL2.git] / doc / exam_fe / 2018_04 / fe_2018_04.texi
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @ifnottex
4 @documentlanguage ja_JP
5 @end ifnottex
6 @setfilename exam_fe_2018h.info
7 @documentencoding UTF-8
8 @settitle 基本技術情報者試験 2018年 春期 午後問題
9 @firstparagraphindent insert
10 @paragraphindent 0
11 @ifhtml
12 @exampleindent 0
13 @end ifhtml
14 @c %**end of header
15
16 @indicateurl{https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_1/2018h30h_fe_pm_qs.pdf} P.62〜P.66より
17
18 @unnumbered 問12
19 次のアセンブラプログラムの説明及びプログラムを読んで,設問1~3に答えよ。
20
21 @unnumberedsec 〔プログラム1の説明〕
22 0~65534の整数を表す数字から成る文字列(以下,数字列という)を数値に変換する副プログラムDTOBである。
23
24 (1) 文字列は,DC命令の文字定数と同じ形式で主記憶に格納される。数字列567を 格納した例を,図1に示す。
25
26 @center @image{img/fig1,15cm,,,.svg}
27
28 @center 図1 数字列の格納例
29
30 (2) 主プログラムは,数字列が格納されている領域の先頭アドレスをGR1に,数字列の長さをGR2に設定して,DTOBを呼ぶ。DTOBは,数値に変換して得た値をGR0に格納して呼出し元に戻る。
31
32 (3) 副プログラムDTOBから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
33
34
35 @unnumberedsubsec〔プログラム1〕
36
37 @verbatim
38 DTOB    START
39         RPUSH
40         ADDL   GR2,GR1
41         LAD    GR0,0           ; 戻り値の初期化
42 LP      CPL    GR1,GR2         ; 変換終了?
43         JZE    FIN
44         LD     GR4,0,GR1       ; 数字1文字の取出し
45         SUBL   GR4,='0'        ; 1 桁を数値に変換
46         SLL    GR0,1           ; GR0を10倍してGR4を加算
47         LD     GR5,GR0
48         ::ansbox:8:a::
49         ADDL   GR0,GR5
50         ADDL   GR0,GR4
51         LAD    GR1,1,GR1
52         JUMP   LP
53 FIN     RPOP
54         RET
55         END
56 @end verbatim
57
58 @unnumberedsec 設問1
59
60 プログラム1中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。
61
62 aに関する解答群
63 @itemize @w{}
64
65 @item
66 ア @code{ADDL  GR5,GR4}
67
68 @item
69 イ @code{SLL   GR4,1}
70
71 @item
72 ウ @code{SLL   GR4,2}
73
74 @item
75 エ @code{SLL   GR5,1}
76
77 @item
78 オ @code{SLL   GR5,2}
79 @end itemize
80
81 @unnumberedsec 設問2
82
83 文字列の先頭から数字列を探索し,順に,対応する数値を管理テーブルに格納する副プログラムGETWDを,DTOBを使用して作成した。プログラム2中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。
84
85
86 @unnumberedsubsec 〔プログラム2の説明〕
87
88 (1) 文字列は,一つ以上の空白文字で区切られた任意の個数の数字列を含み,最後はピリオドで終わる。最後の数字列とピリオドの間,又は文字列の先頭に一つ以上の空白文字があってもよい。文字列の例を,図2に示す。
89
90
91 @center @image{img/fig2,15cm,,,.svg}
92
93 @center 図2 文字列の例
94
95 (2) 管理テーブルには,文字列中に数字列が現れるごとに,順に1 語から成る要素を追加し,数字列を数値に変換して得た値を格納する。数字列の探索が終了したとき,管理テーブルの最後に1 語から成る要素を追加し,数値の終わりを示す印として-1を格納する。図2の文字列をGETWDで処理して得た管理テーブルを,図3に示す。
96
97 @center @image{img/fig3,15cm,,,.svg}
98
99 @center 図3 GETWDで処理して得た管理テーブル
100
101 (3) 主プログラムは,文字列が格納されている領域の先頭アドレスをGR1に,管理テーブルの先頭アドレスをGR2に設定して,GETWDを呼ぶ。
102
103 (4) 副プログラムGETWDから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
104
105 @unnumberedsubsec 〔プログラム2〕
106
107 @verbatim
108 GETWD   START
109         RPUSH
110         LD     GR6,GR1
111         LD     GR7,GR2
112         LD     GR3,=-1       ; 数字列の処理状態フラグの初期化
113         LAD    GR6,-1,GR6
114 LP      LAD    GR6,1,GR6
115         LD     GR4,0,GR6     ; 1文字の取出し
116         CPL    GR4,='.'
117         JZE    FIN
118         CPL    GR4,=' '
119         ::ansbox:8:b::
120         CALL   SETWD
121         JUMP   LP
122 NUM     LD     GR3,GR3       ; 数字列の処理中?
123         JZE    LP
124         LD     GR3,=0        ; 次の数字列の処理開始
125         LD     GR1,GR6       ; 数字列の先頭アドレスを退避
126         JUMP   LP
127 FIN     CALL   SETWD
128         LD     GR2,=-1
129         ST     GR2,0,GR7     ; 数値の終わりを示す印を格納
130         RPOP
131         RET
132 SETWD   LD     GR3,GR3
133         ::ansbox:8:c::
134         LD     GR2,GR6
135         SUBL   GR2,GR1
136         CALL   DTOB          ; 数字列を数値に変換
137         ST     GR0,0,GR7
138         LD     GR3,=-1       ; 数字列の処理中状態を解除
139         ::ansbox:8:d::
140 FIN2    RET
141         END
142 @end verbatim
143
144
145 bに関する解答群
146 @itemize @w{}
147
148 @item
149 ア @code{JNZ    FIN}
150
151 @item
152 イ @code{JNZ    LP}
153
154 @item
155 ウ @code{JNZ    NUM}
156
157 @item
158 エ @code{JZE    FIN}
159
160 @item
161 オ @code{JZE    LP}
162
163 @item
164 カ @code{JZE    NUM}
165 @end itemize
166
167 cに関する解答群
168 @itemize @w{}
169
170 @item
171 ア @code{JNZ    FIN}
172
173 @item
174 イ @code{JNZ    FIN2}
175
176 @item
177 ウ @code{JNZ    NUM}
178
179 @item
180 エ @code{JZE    FIN}
181
182 @item
183 オ @code{JZE    FIN2}
184
185 @item
186 カ @code{JZE    NUM}
187 @end itemize
188
189 d に関する解答群
190
191 @itemize @w{}
192 @item
193 ア @code{LAD    GR6,1,GR1}
194
195 @item
196 イ @code{LAD    GR6,1,GR6}
197
198 @item
199 ウ @code{LAD    GR7,1,GR2}
200
201 @item
202 エ @code{LAD    GR7,1,GR7}
203
204 @item
205 オ @code{LD     GR6,GR1}
206
207 @item
208 カ @code{LD     GR7,GR2}
209 @end itemize
210
211 @unnumberedsec 設問3
212
213 GETWDを使用して,二つの整数の積を求める副プログラムMULTを作成した。プログラム3中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。
214
215 @unnumberedsubsec 〔プログラム3の説明〕
216
217 (1) MULTは,数字列を二つだけ含む,〔プログラム2の説明〕の(1)で示した形式の文字列について,最初の数字列に対応する数値を被乗数とし,2番目の数字列に対応する数値を乗数として乗算を行う。乗算においてあふれは発生しないものとする。
218
219 (2) 主プログラムは,文字列が格納されている領域の先頭アドレスをGR1に設定して,MULTを呼ぶ。MULTは,演算結果をGR0に格納して呼出し元に戻る。
220
221 (3) 副プログラムMULTから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
222
223 @unnumberedsubsec 〔プログラム3〕
224
225 @verbatim
226 MULT   START
227        RPUSH
228        LAD     GR2,CTBL
229        CALL    GETWD
230        LD      GR4,0,GR2    ; GR4 ← 被乗数
231        LD      GR5,1,GR2    ; GR5 ← 乗数
232        LD      GR0,=0
233        LD      GR5,GR5
234 LP     ::ansbox:8:e::
235        LD      GR3,GR5
236        AND     GR3,=#0001   ; 乗数の最下位ビットのチェック
237        JZE     NEXT
238        ADDL    GR0,GR4
239 NEXT   SLL     GR4,1        ; 被乗数を1ビット左論理シフト
240        ::ansbox:8:f::
241        JUMP    LP
242 FIN    RPOP
243        RET
244 CTBL   DS      3            ; GETWD用管理テーブル
245        END
246 @end verbatim
247
248 eに関する解答群
249
250 @itemize @w{}
251 @item
252 ア @code{JMI    FIN}
253
254 @item
255 イ @code{JMI    NEXT}
256
257 @item
258 ウ @code{JPL    FIN}
259
260 @item
261 エ @code{JPL    NEXT}
262
263 @item
264 オ @code{JZE    FIN}
265
266 @item
267 カ @code{JZE    NEXT}
268 @end itemize
269
270
271 fに関する解答群
272
273 @itemize @w{}
274 @item
275 ア @code{ADDL   GR0,GR5}
276
277 @item
278 イ @code{ADDL   GR5,GR4}
279
280 @item
281 ウ @code{LD     GR5,GR4}
282
283 @item
284 エ @code{SLL    GR5,1}
285
286 @item
287 オ @code{SRL    GR5,1}
288 @end itemize
289 @bye