アセンブラ 過去問の解き方(平成29年度春期)


平成29年度春期の問題は、以下の6問でした。


設問の内容
難易度
設問1
穴埋め箇所に適する命令を問う
穴埋め箇所に適する命令を問う
分岐条件を問う
設問2
トレース力
設問3
トレース力と分岐命令の理解
トレース力と閃き

設問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で、GR50を設定しています。
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

行番号4GR14語目のアドレスを設定し、行番号191減算しています。

イ CPL GR3,=0
        GR3は、任意のアドレスですので、0との比較は不適当です。

ウ CPL GR3,GR1
        GR1は、GR31語目のアドレスです。GR1との比較は不適当ではありません。

オ CPL GR3,GR2
        GR2は、GR41語目のアドレスです。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  ]

行番号5GR24語目のアドレスを設定し、行番号201減算しています。
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)を加算した際に、行番号141を設定しています。
二回目のループ時に、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から始まることから、0151631とを区別することで、上位語か下位語を区別します(015が上位か下位かは分りません)。
0151631とを区別できるのは、「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の加算は、カウンタが031までの毎回。

二つの加算箇所は何をしているかを推測

10×510×(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は加算処理を行番号352倍処理を行っていることが閃けば行番号35TEMP値同士を加算していることが分り、正解が「LAD GR2,TEMP」と分ります。

講評

fでは、キと誤って解答した受験者が見受けられた。
乗算は左シフトと加算で、1ビット左シフトは被シフト数の加算でそれぞれ実現できることを踏まえ、fの次の「CALL ADD64」が1ビット左シフトに相当することに気がつけば、正答できた。



0 件のコメント:

コメントを投稿

基本情報技術者試験 アセンブラ(CASL) 原稿 20210529

  基本情報技術者試験 アセンブラ(CASL) 簡単に5割 平成21年春期,平成21年秋期 平成21春期 平成21秋期 平成22春期 平成22秋期 平成21春期 概要 解き方 設問1-a 設問1-b 設問1-c 設問2-d...