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

設問1のa

問われている内容は?

GR4を正しく設定する命令はどれか?

6
7
8
SUBL  GR1,=1       ; GR1で日数をカウント
[   a   ]
ADDL  GR1,-1,GR4  ; 11日からの回数(平年)を求める

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  ; 11日からの回数(平年)を求める

論理加算
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月までの11日からの日数が設定されていることが分ります。

25
26
; ACCMDAYS,平年の各月1日の11日からの日数(11日は0日目)
 ACCMDAYS DC 0,31,59,90,120,151,181,212,243,273,304,334

上記の二点から、「イ ACCMDAYSGR3が適していることが分ります。

「ア 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

GR2GR5の用法は?

GR2GR5がどのように使用されているか確認してみます。

GR2の用法:変数として使用されています(初期値が19701ずつ加算)。
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が正解となります。

講評

bcの正答率は平均的で、おおむね理解されていた。

設問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で割り切れない場合、平年とする。」の処理に該当することが分ります。

3ANDした結果が0以外なら、4で割り切れないことになるので、「イ JNZ FINが正解となることが分ります。

講評

bcの正答率は平均的で、おおむね理解されていた。

設問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
しない

01を反転させる命令「カ XOR  GR0,=1」が正解となります。

DIVISIBLの復帰値(GR0)がLEAPYEARの復帰値(GR0)の比較

DIVISIBLの復帰値とLEAPYEARの復帰値を比較することで、解答を導き出せます。


100で割り切れる
100で割り切れない
DIVISIBLの復帰値
1
0
LEAPYEARの復帰値
0(平年)
1(うるう年)

01を反転させる命令「カ 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テーブル格納値
       計算後の最大値:3641231日)

イ 13      ADDL  GR1,GR0
        加算処理内容 :行番号8で算出された平年時の日数にうるう日反映
       計算後の最大値:365(うるう年の1231日)

ウ 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 件のコメント:

コメントを投稿

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

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