平成29年度春期の問題は、以下の6問でした。
設問の内容
|
難易度
|
||
設問1
|
a
|
穴埋め箇所に適する命令を問う
|
易
|
b
|
穴埋め箇所に適する命令を問う
|
難
|
|
c
|
分岐条件を問う
|
易
|
|
設問2
|
d
|
トレース力
|
難
|
設問3
|
e
|
トレース力と分岐命令の理解
|
難
|
f
|
トレース力と閃き
|
難
|
設問1のa
問われている内容は?
穴埋め箇所に適する命令は?
|
9
|
JUMP NOV1
|
10
11
12
13
|
OV1 [
a ]
NOV1 ADDL GR0,0,GR4
JOV
OV2
JUMP NOV2
|
14
15
16
17
18
|
OV2 [
a ]
NOV2 ST
GR0,0,GR3
LD
GR0,GR5
[
b ]
JZE
EXIT
|
ア
|
AND GR5,=1
|
イ
|
CPL GR3,=0
|
ウ
|
CPL GR3,GR1
|
エ
|
CPL GR3,GR2
|
オ
|
LD GR5,=1
|
穴埋め箇所の次の命令から絞り込む
次の命令が分岐命令ではありませんので、「CPL」命令は除外され、「ア AND GR5,=1」「オ LD GR5,=1」に絞り込まれます。
更に絞り込む
残った選択肢の命令は、いずれもGR5に対する命令なので、GR5に着目して絞り込んでみる。
6
7
8
9
10
11
|
LOOP LD
GR5,=0
ADDL GR0,0,GR3
JOV
OV1
JUMP NOV1
OV1 [
a ]
NOV1 ADDL GR0,0,GR4
|
行番号6で、GR5に0を設定しています。
0が設定されたGR5に対するAND命令は無意味なので、ANDは除外され、「オ LD GR5,=1」が正解となります。
講評
aの正答率は平均的で、おおむね理解されていた。
|
設問1のb
問われている内容は?
穴埋め箇所に適する命令は?
|
14
15
16
17
18
|
OV2 [
a ]
NOV2 ST
GR0,0,GR3
LD
GR0,GR5
[
b ]
JZE
EXIT
|
ア
|
AND GR5,=1
|
イ
|
CPL GR3,=0
|
ウ
|
CPL GR3,GR1
|
エ
|
CPL GR3,GR2
|
オ
|
LD GR5,=1
|
個々に検証
次行が、EXIT(処理終了)箇所への分岐なので、本行は処理終了かどうかを判定する処理となる。
個々に検証してみる。
先ずは、GR5を操作する「ア」と「オ」について検証してみる。
ア AND
GR5,=1
|
除外できるかどうか分らない。
オ LD GR5,=1
|
次行で、常に分岐しないので除外される。
次に、GR3を比較する「イ」「ウ」と「エ」について検証してみる。
検証前にGR3の用途を確認する。
4
5
6
7
15
18
19
21
22
|
LAD
GR3,3,GR1
LAD
GR4,3,GR2
LOOP LD
GR5,=0
ADDL GR0,0,GR3
NOV2 ST
GR0,0,GR3
JZE
EXIT
SUBL GR3,=1
[
c ]
EXIT RPOP
|
行番号4でGR1の4語目のアドレスを設定し、行番号19で1減算しています。
イ CPL GR3,=0
|
GR3は、任意のアドレスですので、0との比較は不適当です。
ウ CPL GR3,GR1
|
GR1は、GR3の1語目のアドレスです。GR1との比較は不適当ではありません。
オ CPL GR3,GR2
|
GR2は、GR4の1語目のアドレスです。GR2との比較は不適当です。
以上から、「ウ
CPL GR3,GR1」が適しています。
講評
bの正答率は低く、あまり理解されていなかった。イと誤って解答した受験者が見受けられた。(GR3)の初期値が(GR1)+3であることや、ループの繰返し回数が4回であることに気がつけば、正答できた。
|
設問1のc
問われている内容は?
分岐条件は?
|
20
21
|
SUBL GR4,=1
[
c ]
|
ア
|
JOV LOOP
|
イ
|
JUMP LOOP
|
ウ
|
JZE LOOP
|
個々に検証
検証前にGR4の用途を確認する。
5
6
11
20
21
|
LAD
GR4,3,GR2
LOOP LD
GR5,=0
NOV1 ADDL GR0,0,GR4
SUBL GR4,=1
[
c ]
|
行番号5でGR2の4語目のアドレスを設定し、行番号20で1減算しています。
GR4は任意のアドレスですので、計算結果(結果が0なるなどの計算結果)で比較することは不適当です。
正解は、「イ JUMP LOOP」となります。
講評
cの正答率は高く、よく理解されていた。
|
設問2
問われている内容は?
プログラムのトレース結果
|
3
4
5
6
7
8
9
|
;1回目
LD
GR0,=0 ;GR0=0
LAD
GR3,3,GR1 ;GR3=GR1+3
LAD
GR4,3,GR2 ;GR4=GR2+3
LOOP LD
GR5,=0 ;GR5=0
ADDL GR0,0,GR3 ;GR0←0 + #A684
JOV
OV1
JUMP NOV1 ;JUMP NOV1
|
11
12
|
NOV1 ADDL GR0,0,GR4 ;GR0←#A684 + #B759
JOV
OV2 ;JOV OV2
|
14
15
16
|
OV2 [LD
GR5,=1] ;GR5=1
NOV2 ST
GR0,0,GR3
LD
GR0,GR5 ;GR0=GR5=1
|
19
20
21
|
SUBL GR3,=1
SUBL GR4,=1
[JUMP LOOP]
|
6
7
|
LOOP LD
GR5,=0 ;GR5=0
ADDL GR0,0,GR3 ;GR0←1 + #2E0C
|
+0
|
+1
|
+2
|
+3
|
|
GR1
|
#3F1D
|
#B759
|
#2E0C
|
#A684
|
GR2
|
#2E0C
|
#A684
|
#3F1D
|
#B759
|
ア
|
#0000
|
イ
|
#0001
|
ウ
|
#2E0C
|
エ
|
#2E0D
|
オ
|
#3F1D
|
カ
|
#3F1E
|
試してみる
GR1+2の内容(#2E0C)を加算しているので、#2E0Cより大きい数字が正解になります。
加算した結果が #3F1D 、#3F1E
となることは考えにくい(#3F1D は、GR2+2の内容)。
以上から、「ウ #2E0C」「エ #2E0D」のいずれかが正解と考えられます。
一回目のループ時に、GR1+3の内容(#A684)とGR2+3の内容(#B759)を加算した際に、行番号14で1を設定しています。
二回目のループ時に、1と#2E0Cを加算していますので、正解は、「エ #2E0D」となります。
講評
設問2の正答率は低く、あまり理解されていなかった。ウと誤って解答した受験者が見受けられた。16進数も10進数と同様に、同じ桁同士を加算し、基数(16)以上の値になれば桁上がりすることを理解していれば、正答できた。アセンブラ言語では16進数による表現を多用するので、慣れておいてほしい。
|
設問3のe
問われている内容は?
穴埋め箇所に適する命令は?
|
17
18
19
20
21
22
23
24
25
|
LOOP LD
GR6,GR5
SUBL GR6,=16
[
e ]
LD GR0,0,GR2
SRL GR0,0,GR6
JUMP TESTBIT
LOWORD LD GR0,1,GR2
SRL GR0,0,GR5
TESTBIT AND
GR0,=#0001
|
ア
|
JMI LOWORD
|
イ
|
JNZ LOWORD
|
ウ
|
JPL LOWORD
|
エ
|
JZE LOWORD
|
オ
|
LAD GR2,TEMP
|
カ
|
LD GR2,=1
|
キ
|
LD GR2,GR3
|
ク
|
LD GR2,TEMP
|
穴埋め箇所を絞り込む
解答群は、「LOWORDへの分岐命令」と「GR2の更新命令」から構成されています。
穴埋め箇所[
f ]の前の命令から、穴埋め箇所[ f ]は、「GR2の更新命令」となります。
穴埋め箇所[
f ]が「LOWORDへの分岐命令」でない時、LOWORDへの分岐箇所がなくなるので、穴埋め箇所[ e ]は、「LOWORDへの分岐命令」となります。
LOWORDへの分岐命令は、以下の四つに絞り込まれます。
l ア JMI LOWORD
l イ JNZ LOWORD
l ウ JPL LOWORD
l エ JZE LOWORD
GR5のループカウンタは、0から始まり1ずつ加算されています。
0から始まることから、0~15と16~31とを区別することで、上位語か下位語を区別します(0~15が上位か下位かは分りません)。
0~15と16~31とを区別できるのは、「ア JMI LOWORD」になります。
GR6設定値
|
0
|
15
|
16
|
31
|
|
SUBL GR6,=16実行結果
|
-16
|
-1
|
0
|
15
|
|
分岐
する
しない
|
ア JMI
|
する
|
する
|
しない
|
しない
|
イ JNZ
|
する
|
する
|
しない
|
する
|
|
ウ JPL
|
しない
|
しない
|
しない
|
する
|
|
エ JZE
|
しない
|
しない
|
する
|
しない
|
講評
設問3の正答率は低く、あまり理解されていなかった。
eでは、ウ又はエと誤って解答した受験者が見受けられた。
eに当てはめた条件分岐命令の条件成立時、不成立時それぞれにおいてアクセスするメモリアドレスに注目すれば、正答できた。
|
設問3のf
問われている内容は?
GR2を更新する適した命令は?
|
30
31
32
33
34
35
36
37
|
EXITLOOP CPL GR5,=31
JZE
EXIT
ADDL GR5,=1
LAD
GR1,TEMP
[
f ]
CALL ADD64
LD
GR2,GR4 ;GR4に退避した値をGR2に復帰
JUMP LOOP
|
ア
|
JMI LOWORD
|
イ
|
JNZ LOWORD
|
ウ
|
JPL LOWORD
|
エ
|
JZE LOWORD
|
オ
|
LAD GR2,TEMP
|
カ
|
LD GR2,=1
|
キ
|
LD GR2,GR3
|
ク
|
LD GR2,TEMP
|
穴埋め箇所の前の命令から絞り込む
前の命令が「LAD」ですので、分岐命令は除外されます。
プログラム「ADD64」は、GR2を引数(整数を格納する領域のアドレス)とします。
GR2に整数を格納するアドレスを設定する命令は?
アドレスを設定する命令は、以下の二つに絞り込まれます。
l オ LAD GR2,TEMP
l キ LD GR2,GR3
プログラムのトレースが必要です。
一旦、他の設問の解答を優先した後、プログラムをトレースします。
プログラム2をトレースします
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
MUL32 START
RPUSH
LAD
GR7,TEMP ;
LD
GR0,0,GR1 ;
ST
GR0,2,GR7 ;(TEMP+2)
← GR1+0
LD
GR0,1,GR1 ;
ST
GR0,3,GR7 ;(TEMP+3)
← GR1+1
LD
GR0,=0 ;
ST
GR0,0,GR7 ;(TEMP+0)
← 0
ST
GR0,1,GR7 ;(TEMP+1)
← 0
ST
GR0,0,GR3 ;(GR0+0)
← 0
ST
GR0,1,GR3 ;(GR0+1)
← 0
ST
GR0,2,GR3 ;(GR0+2)
← 0
ST
GR0,3,GR3 ;(GR0+3)
← 0
LD
GR5,=0 ;ループカウンタ
LD
GR4,GR2 ;GR2の値をGR4に退避
LOOP LD
GR6,GR5 ;GR6 ←
GR5(ループカウンタ)
SUBL GR6,=16 ;上位/下位?
[
e ]
LD
GR0,0,GR2 ;GR0 ← (GR2+0) (上位)
SRL
GR0,0,GR6 ;右シフト(カウンタ-16)
JUMP TESTBIT
LOWORD LD
GR0,1,GR2 ;GR0 ← (GR2+1) (下位)
SRL
GR0,0,GR5 ;右シフト(カウンタ)
TESTBIT AND
GR0,=#0001 ;シフト後の最下位ビットON?
JZE
EXITLOOP
LD
GR1,GR3 ;シフト後の最下位ビットONの時
LAD
GR2,TEMP ;TEMP=TEMP+GR3
CALL ADD64
EXITLOOP
CPL GR5,=31 ;全ビット終了?
JZE
EXIT
ADDL GR5,=1 ;カウンタUP
LAD
GR1,TEMP
[
f ]
CALL ADD64
LD
GR2,GR4 ;GR4に退避した値をGR2に復帰
JUMP LOOP
EXIT RPOP
RET
TEMP DS 4
END
|
行番号29の加算は、GR2に設定された整数のビットがONの時のみ。
行番号35の加算は、カウンタが0~31までの毎回。
二つの加算箇所は何をしているかを推測
10×5=10×(0101)2
=10×(0001)2×1 + 10×(0010)2×0 +
10×(0100)2×1 + 10×(1000)2×0
=10×1×1 +
10×2×0 + 10×4×1 + 10×8×0
=10×1×1 +
10×1×2×0 + 10×1×2×2×1 + 10×1×2×2×2×0
です。
行番号29は加算処理を行番号35は2倍処理を行っていることが閃けば、行番号35がTEMP値同士を加算していることが分り、正解が「オ LAD GR2,TEMP」と分ります。
講評
fでは、キと誤って解答した受験者が見受けられた。
乗算は左シフトと加算で、1ビット左シフトは被シフト数の加算でそれぞれ実現できることを踏まえ、fの次の「CALL ADD64」が1ビット左シフトに相当することに気がつけば、正答できた。
|
0 件のコメント:
コメントを投稿