X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=doc%2Fexam_fe%2F2018_04%2Ffe_2018_04.texi;fp=doc%2Fexam_fe%2F2018_04%2Ffe_2018_04.texi;h=e9f6a12a89bc2a2f90463806b6eb8dc4b0332090;hb=bce17a4fab0759bd0818c44bdf3cd17edb388267;hp=0000000000000000000000000000000000000000;hpb=8b9bafa8e8927ad19968969f466c756f0aeac8a3;p=YACASL2.git diff --git a/doc/exam_fe/2018_04/fe_2018_04.texi b/doc/exam_fe/2018_04/fe_2018_04.texi new file mode 100644 index 0000000..e9f6a12 --- /dev/null +++ b/doc/exam_fe/2018_04/fe_2018_04.texi @@ -0,0 +1,289 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@ifnottex +@documentlanguage ja_JP +@end ifnottex +@setfilename exam_fe_2018h.info +@documentencoding UTF-8 +@settitle 基本技術情報者試験 2018年 春期 午後問題 +@firstparagraphindent insert +@paragraphindent 0 +@ifhtml +@exampleindent 0 +@end ifhtml +@c %**end of header + +@indicateurl{https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_1/2018h30h_fe_pm_qs.pdf} P.62〜P.66より + +@unnumbered 問12 +次のアセンブラプログラムの説明及びプログラムを読んで,設問1~3に答えよ。 + +@unnumberedsec 〔プログラム1の説明〕 +0~65534の整数を表す数字から成る文字列(以下,数字列という)を数値に変換する副プログラムDTOBである。 + +(1) 文字列は,DC命令の文字定数と同じ形式で主記憶に格納される。数字列567を 格納した例を,図1に示す。 + +@center @image{img/fig1,15cm,,,.svg} + +@center 図1 数字列の格納例 + +(2) 主プログラムは,数字列が格納されている領域の先頭アドレスをGR1に,数字列の長さをGR2に設定して,DTOBを呼ぶ。DTOBは,数値に変換して得た値をGR0に格納して呼出し元に戻る。 + +(3) 副プログラムDTOBから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。 + + +@unnumberedsubsec〔プログラム1〕 + +@verbatim +DTOB START + RPUSH + ADDL GR2,GR1 + LAD GR0,0 ; 戻り値の初期化 +LP CPL GR1,GR2 ; 変換終了? + JZE FIN + LD GR4,0,GR1 ; 数字1文字の取出し + SUBL GR4,='0' ; 1 桁を数値に変換 + SLL GR0,1 ; GR0を10倍してGR4を加算 + LD GR5,GR0 + ::ansbox:8:a:: + ADDL GR0,GR5 + ADDL GR0,GR4 + LAD GR1,1,GR1 + JUMP LP +FIN RPOP + RET + END +@end verbatim + +@unnumberedsec 設問1 + +プログラム1中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。 + +aに関する解答群 +@itemize @w{} + +@item +ア @code{ADDL GR5,GR4} + +@item +イ @code{SLL GR4,1} + +@item +ウ @code{SLL GR4,2} + +@item +エ @code{SLL GR5,1} + +@item +オ @code{SLL GR5,2} +@end itemize + +@unnumberedsec 設問2 + +文字列の先頭から数字列を探索し,順に,対応する数値を管理テーブルに格納する副プログラムGETWDを,DTOBを使用して作成した。プログラム2中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。 + + +@unnumberedsubsec 〔プログラム2の説明〕 + +(1) 文字列は,一つ以上の空白文字で区切られた任意の個数の数字列を含み,最後はピリオドで終わる。最後の数字列とピリオドの間,又は文字列の先頭に一つ以上の空白文字があってもよい。文字列の例を,図2に示す。 + + +@center @image{img/fig2,15cm,,,.svg} + +@center 図2 文字列の例 + +(2) 管理テーブルには,文字列中に数字列が現れるごとに,順に1 語から成る要素を追加し,数字列を数値に変換して得た値を格納する。数字列の探索が終了したとき,管理テーブルの最後に1 語から成る要素を追加し,数値の終わりを示す印として-1を格納する。図2の文字列をGETWDで処理して得た管理テーブルを,図3に示す。 + +@center @image{img/fig3,15cm,,,.svg} + +@center 図3 GETWDで処理して得た管理テーブル + +(3) 主プログラムは,文字列が格納されている領域の先頭アドレスをGR1に,管理テーブルの先頭アドレスをGR2に設定して,GETWDを呼ぶ。 + +(4) 副プログラムGETWDから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。 + +@unnumberedsubsec 〔プログラム2〕 + +@verbatim +GETWD START + RPUSH + LD GR6,GR1 + LD GR7,GR2 + LD GR3,=-1 ; 数字列の処理状態フラグの初期化 + LAD GR6,-1,GR6 +LP LAD GR6,1,GR6 + LD GR4,0,GR6 ; 1文字の取出し + CPL GR4,='.' + JZE FIN + CPL GR4,=' ' + ::ansbox:8:b:: + CALL SETWD + JUMP LP +NUM LD GR3,GR3 ; 数字列の処理中? + JZE LP + LD GR3,=0 ; 次の数字列の処理開始 + LD GR1,GR6 ; 数字列の先頭アドレスを退避 + JUMP LP +FIN CALL SETWD + LD GR2,=-1 + ST GR2,0,GR7 ; 数値の終わりを示す印を格納 + RPOP + RET +SETWD LD GR3,GR3 + ::ansbox:8:c:: + LD GR2,GR6 + SUBL GR2,GR1 + CALL DTOB ; 数字列を数値に変換 + ST GR0,0,GR7 + LD GR3,=-1 ; 数字列の処理中状態を解除 + ::ansbox:8:d:: +FIN2 RET + END +@end verbatim + + +bに関する解答群 +@itemize @w{} + +@item +ア @code{JNZ FIN} + +@item +イ @code{JNZ LP} + +@item +ウ @code{JNZ NUM} + +@item +エ @code{JZE FIN} + +@item +オ @code{JZE LP} + +@item +カ @code{JZE NUM} +@end itemize + +cに関する解答群 +@itemize @w{} + +@item +ア @code{JNZ FIN} + +@item +イ @code{JNZ FIN2} + +@item +ウ @code{JNZ NUM} + +@item +エ @code{JZE FIN} + +@item +オ @code{JZE FIN2} + +@item +カ @code{JZE NUM} +@end itemize + +d に関する解答群 + +@itemize @w{} +@item +ア @code{LAD GR6,1,GR1} + +@item +イ @code{LAD GR6,1,GR6} + +@item +ウ @code{LAD GR7,1,GR2} + +@item +エ @code{LAD GR7,1,GR7} + +@item +オ @code{LD GR6,GR1} + +@item +カ @code{LD GR7,GR2} +@end itemize + +@unnumberedsec 設問3 + +GETWDを使用して,二つの整数の積を求める副プログラムMULTを作成した。プログラム3中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。 + +@unnumberedsubsec 〔プログラム3の説明〕 + +(1) MULTは,数字列を二つだけ含む,〔プログラム2の説明〕の(1)で示した形式の文字列について,最初の数字列に対応する数値を被乗数とし,2番目の数字列に対応する数値を乗数として乗算を行う。乗算においてあふれは発生しないものとする。 + +(2) 主プログラムは,文字列が格納されている領域の先頭アドレスをGR1に設定して,MULTを呼ぶ。MULTは,演算結果をGR0に格納して呼出し元に戻る。 + +(3) 副プログラムMULTから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。 + +@unnumberedsubsec 〔プログラム3〕 + +@verbatim +MULT START + RPUSH + LAD GR2,CTBL + CALL GETWD + LD GR4,0,GR2 ; GR4 ← 被乗数 + LD GR5,1,GR2 ; GR5 ← 乗数 + LD GR0,=0 + LD GR5,GR5 +LP ::ansbox:8:e:: + LD GR3,GR5 + AND GR3,=#0001 ; 乗数の最下位ビットのチェック + JZE NEXT + ADDL GR0,GR4 +NEXT SLL GR4,1 ; 被乗数を1ビット左論理シフト + ::ansbox:8:f:: + JUMP LP +FIN RPOP + RET +CTBL DS 3 ; GETWD用管理テーブル + END +@end verbatim + +eに関する解答群 + +@itemize @w{} +@item +ア @code{JMI FIN} + +@item +イ @code{JMI NEXT} + +@item +ウ @code{JPL FIN} + +@item +エ @code{JPL NEXT} + +@item +オ @code{JZE FIN} + +@item +カ @code{JZE NEXT} +@end itemize + + +fに関する解答群 + +@itemize @w{} +@item +ア @code{ADDL GR0,GR5} + +@item +イ @code{ADDL GR5,GR4} + +@item +ウ @code{LD GR5,GR4} + +@item +エ @code{SLL GR5,1} + +@item +オ @code{SRL GR5,1} +@end itemize +@bye