設問1のa
問われている内容は?
GR4を正しく設定する命令はどれか?
|
6
7
8
|
SUBL GR1,=1
; GR1で日数をカウント
[ a ]
ADDL GR1,-1,GR4 ; 1月1日からの回数(平年)を求める
|
ア
|
LAD
GR4,ACCMDAYS
|
イ
|
LAD
GR4,ACCMDAYS,GR3
|
ウ
|
LAD
GR4,ACCMDAYS,GR5
|
エ
|
LD GR4,ACCMDAYS
|
オ
|
LD GR4,ACCMDAYS,GR3
|
カ
|
LD GR4,ACCMDAYS,GR5
|
GR4に設定される値は“実効アドレス”か“データ”か?
解答群を見ると、GR4への設定方法が問われています。
行番号8の用例を確認すると、GR4は“実効アドレス”として使用されていることが分ります。
8
|
ADDL GR1,-1,GR4 ; 1月1日からの回数(平年)を求める
|
論理加算
ADD Logical
|
ADDL
|
r1,r2
|
r1 ← (r1) +L (r2)
|
r,adr,[,x]
|
r ← (r)
+L (実効アドレス)
|
GR4に“実効アドレス”を格納するものを選ぶ
解答群の中から、GR4に“実効アドレス”を格納する選択肢を選出すると、「ア」「イ」「ウ」が残ります。
ア
|
LAD GR4,ACCMDAYS
|
イ
|
LAD
GR4,ACCMDAYS,GR3
|
ウ
|
LAD
GR4,ACCMDAYS,GR5
|
“実効アドレス”として適しているものは?
「ア」「イ」「ウ」から、適切な選択肢を選出します。
l 行番号3~行番号6から、GR3には“月”が設定され、GR5には“年”が設定されていることが分ります。
3
4
5
6
|
LD GR5,0,GR2 ; GR5 : 年
LD GR3,1,GR2 ; GR3 : 月
LD GR1,2,GR2 ; GR1 : 日
SUBL GR1,=1 ; GR1で日数をカウント
|
l 行番号25~行番号26から、ACCMDAYSには“1月から12月までの1月1日からの日数”が設定されていることが分ります。
25
26
|
; ACCMDAYSは,平年の各月1日の1月1日からの日数(1月1日は0日目)
ACCMDAYS DC
0,31,59,90,120,151,181,212,243,273,304,334
|
上記の二点から、「イ
ACCMDAYS+GR3」が適していることが分ります。
「ア LAD GR4,ACCMDAYS」の場合、「ADDL GR1,-1,GR4」でACCMDAYS外を参照してしまいます。
「ウ LAD GR4,ACCMDAYS,GR5」の場合、GR5に年が格納されるので、ACCMDAYS外を参照してしまいます。
講評
aの正答率は低く、あまり理解されていなかった。
オ(LD
GR4,ACCMDAYS,GR3)と誤って解答した受験者が見受けられた。
LAD命令とLD命令の違いを理解していれば、正答できた。
|
設問1のb
問われている内容は?
BREAKに分岐する分岐命令は?
(⇒1970年から(年-1)年までの間、分岐しない分岐命令はどれか? )
|
11
14
15
16
|
LD
GR2,GR5
LD
GR2,=1970 ; 1970年から(年-1)年までの間
LOOP CPA
GR2,GR5
[
b ]
|
ア
|
JMI
BREAK
|
イ
|
JNZ
BREAK
|
ウ
|
JOV
BREAK
|
エ
|
JPL
BREAK
|
オ
|
JUMP
BREAK
|
カ
|
JZE
BREAK
|
GR2、GR5の用法は?
GR2とGR5がどのように使用されているか確認してみます。
GR2の用法:変数として使用されています(初期値が1970で1ずつ加算)。
GR5の用法:指定年が格納されています。
3
|
LD
GR5,0,GR2 ; GR5に指定年を設定
|
11
|
LD
GR2,GR5 ; GR2に指定年を設定
|
14
15
16
|
LD
GR2,=1970
;
変数GR2に初期値を設定
LOOP CPA GR2,GR5 ; 変数GR2と指定年を比較
[
b ] ; 変数<指定年の間処理継続
|
20
21
|
ADDA
GR2,=1
;
変数更新(+1)
JUMP
LOOP
|
LOOPを抜ける条件は?
コメントに、「1970年から(年-1)年までの間、1年の日数加算」と記載されています。
よって、変数(GR2)が年(GR5)と一致した時に分岐する「カ JZE BREAK」が正解となります。
講評
bとcの正答率は平均的で、おおむね理解されていた。
|
設問1のc
問われている内容は?
FINに分岐する分岐命令は?
|
5
6
|
AND
GR3,=3
[ b ]
|
ア
|
JMI FIN
|
イ
|
JNZ FIN
|
ウ
|
JOV FIN
|
エ
|
JUMP FIN
|
オ
|
JZE FIN
|
GR3の用法は?
GR3がどのように使用されているか確認してみます。
GR3の用法:指定年が格納されています。
3
|
LDAYOFFST
LD GR5,0,GR2 ; GR5に指定年格納
|
11
12
|
LD GR2,GR5 ; LEAPYEARの引数GR2に指定年格納
CALL LEAPYEAR
|
4
5
6
|
LEAPYEAR
LD
GR3,GR2 ; GR3に指定年格納
AND GR3,=3 ; 指定年の下位2ビット抽出
[ b ]
|
この分岐箇所で何を判断したいのか?
コメントにヒントがないので、〔プログラムの説明〕と〔プログラムソース〕と照らし合わせます。
年が平年であるか、うるう年であるかの判定は、次の順で行う。
① 年が4で割り切れない場合、平年とする。
② 年が4で割り切れ、かつ100で割り切れない場合、うるう年とする。
③ 年が400で割り切れる場合、うるう年とする。
|
4
5
6
7
8
9
10
11
12
|
LD
GR3,GR2
AND
GR3,=3 ;年が4割り切れるか?
[ c ]
LD
GR3,=100
CALL
DIVISIBL ;年が100で割り切れるか?
[ d ]
JNZ
FIN
LD
GR3,=400
CALL
DIVISIBL ;年が400で割り切れるか?
|
〔プログラムの説明〕と〔プログラムソース〕と照らし合わせた結果、行番号5~行番号6は、「年が4で割り切れない場合、平年とする。」の処理に該当することが分ります。
3でANDした結果が0以外なら、4で割り切れないことになるので、「イ JNZ FIN」が正解となることが分ります。
講評
bとcの正答率は平均的で、おおむね理解されていた。
|
設問1のd
問われている内容は?
GR0に対するビット操作で適している命令は?
|
7
8
9
10
11
|
LD
GR3,=100 ;年が100で割り切れるか?
CALL
DIVISIBL
[
d ]
JNZ
FIN ;100で割り切れない時、うるう年確定
LD
GR3,=400 ;年が400で割り切れるか?
|
ア
|
AND
GR0,=#FFFE
|
イ
|
AND
GR0,=1
|
ウ
|
OR GR0,=#FFFE
|
エ
|
OR GR0,=1
|
オ
|
XOR
GR0,=#FFFE
|
カ
|
XOR
GR0,=1
|
GR0の用法は?
GR0がどのように使用されているか確認してみます。
GR3の用法:DIVISIBL の復帰値(1:割切れる、0:割切れない)として使用されています。
100で割り切れない時(DIVISIBL
の復帰値=0)、うるう年で確定するので、FINに分岐します。
穴埋め箇所では、分岐命令JNZで分岐するように変換する必要があります。
個々の選択肢を検証
ここの選択肢の命令を検証します。
選択肢
|
0との演算結果
|
JNZで分岐
|
1との演算結果
|
JNZで分岐
|
|
ア
|
AND
GR0,=#FFFE
|
0
|
0
|
しない
|
|
イ
|
AND
GR0,=1
|
0
|
1
|
||
ウ
|
OR GR0,=#FFFE
|
#FFFE
|
する
|
#FFFF
|
|
エ
|
OR GR0,=1
|
1
|
する
|
1
|
|
オ
|
XOR
GR0,=#FFFE
|
#FFFE
|
する
|
#FFFF
|
|
カ
|
XOR
GR0,=1
|
1
|
する
|
0
|
しない
|
0と1を反転させる命令「カ XOR GR0,=1」が正解となります。
DIVISIBLの復帰値(GR0)がLEAPYEARの復帰値(GR0)の比較
DIVISIBLの復帰値とLEAPYEARの復帰値を比較することで、解答を導き出せます。
100で割り切れる
|
100で割り切れない
|
|
DIVISIBLの復帰値
|
1
|
0
|
LEAPYEARの復帰値
|
0(平年)
|
1(うるう年)
|
0と1を反転させる命令「カ XOR GR0,=1」が正解となります。
講評
dの正答率は低く、あまり理解されていなかった。イ(AND GR0,=1)と誤って解答した受験者が見受けられた。年を100で割り切れるかどうかを判定するために副プログラムDIVISIBLを呼び出し、その戻り値が0であれば、100で割り切れきれないことが分り、うるう年であることが確定する。
副プログラムLEAPYEARは、うるう年の場合、その戻り値が1でなければならないので、DIVISIBLの戻り値0を反転させ、1を戻り値として戻る。
イ(AND GR0,=1)では、DIVISIBLの戻り値が変わらないので、正しい判定ができないことに注意が必要である。
|
設問2のe
問われている内容は?
設問内容は、以下のとおりです。
あふれの発生する命令は?
|
解答群の示す命令を確認します。
ア 8 ADDL GR1,-1,GR4
|
イ 13 ADDL GR1,GR0
|
ウ 18 ADDL GR0,=365
|
エ 19 ADDL GR1,GR0
|
オ 20 ADDA GR2,=1
|
ヒントはないか?
コメントやプログラムの説明に、ヒントは記述されていないようで、プログラム全体をトレースする必要がある問題です。(各年度に必ず1題は出題されます。)
プログラムをトレースし、選択肢を個々に検証
ア~オの加算処理は、以下の加算を実施しています。
ア 8 ADDL GR1,-1,GR4
|
加算処理内容 :(指定日-1) + ACCMDAYSテーブル格納値
計算後の最大値:364(12月31日)
イ 13 ADDL GR1,GR0
|
加算処理内容 :行番号8で算出された平年時の日数にうるう日反映
計算後の最大値:365(うるう年の12月31日)
ウ 18 ADDL GR0,=365
|
加算処理内容 :指定年以前の1年の日数算出
計算後の最大値:366(うるう年の日数)
エ 19 ADDL GR1,GR0
|
加算処理内容 :行番号13+行番号8
計算後の最大値:366以上
オ 20 ADDA
GR2,=1
|
加算処理内容 :初期値を1970とする変数
計算後の最大値:指定年
「エ 行番号19」であふれが発生することが分ります。
講評
eの正答率は低く、あまり理解されていなかった。
GR0でその年の日数を求めるので、計算過程で1年の日数を超えない値であることが理解できれば、正答できた。
|
設問2のf
問われている内容は?
設問内容は、以下のとおりです。
あふれを検知する分岐命令は?
|
解答群の示す命令を確認する
あふれを検知する分岐命令は、「JOV」ですので、解答群から「JOV」を捜します。
「ウ JOV」が正解となります。
講評
fの正答率は高く、よく理解されていた。
|
0 件のコメント:
コメントを投稿