アセンブラ すぐ解ける問題の解き方 平成31年度 春期

プログラム全体をトレースすることなく、短時間で解ける問題について、その解答方法を紹介します。

a~fの6問のうちa,c,e,f4問が、プログラム全体をトレースすることなく、解くことができます。

設問1 - a

[穴埋め箇所]


[選択肢]



[解き方]

1.  解答群からの推定
解答群の命令は、いずれも“GR2”を更新しています。
⇒“GR2”が何なのか?

2.  更新前の“GR2”は?
“GR3”には「ビット位置」が格納されます。
(「3行目」のコメントより)
“GR2”にも「ビット位置」が格納されます。
(「6行目」の「LD GR2,GR3」により)

3.  更新後の“GR2”は?
“GR2”には「相対アドレス」が格納されます。
(
4行目」のコメント(「ビット位置を、相対アドレス(GR2)に変換」)より)

4.  「相対アドレス」とは?
〔プログラムの説明〕の図1で示されるように、相対アドレスは16ビット毎に加算される値です。
「相対アドレス」は、「ビット位置」を16で割ることで求められます。
5.  正答は?
穴埋め箇所は、「ビット位置」から「相対アドレス」に変換する処理となります。「相対アドレス」は「ビット位置」を16で割ることで得られます。
「ビット位置」を16で割る命令は「SRL GR2,4」です。

「オ」が正解となります。

[別の絞り込み方法]

1.  命令の妥当性から推定
l  3行目」のコメントより、“GR3”には「ビット位置」が格納されます。
l  「ビット位置」の取り得る値は、0~無限であり、選択肢の「ア」「ウ」「エ」「カ」の命令におけるシフト量としては不適当です。
以上より、選択肢の「ア」「ウ」「エ」「カ」の可能性は低くなります。

2.  アセンブラのお決まりの処理パターンから推定
上位の情報と下位の情報を抽出するにあたって、お決まりの処理を行うことが多々あります。
上位16bitと下位4bitを抽出する場合、以下のように処理します。
l  上位の情報抽出方法:4bit右にシフト
l  下位の情報抽出方法:#000FAND

このことから、選択肢を絞り込むことは難しいですが、知識の片隅にあると便利です。

設問1 - c

[穴埋め箇所]



[選択肢]


[解き方]

1. 解答群からの推定

分岐条件と分岐先が問われています。

分岐条件と分岐先を整理します。
⇒分岐条件は「JNZ」、「JPL」、「JZE」からの三択
分岐先は"FIN"、" LOOP"からの二択

2. 分岐条件の整理

「27行目」の「LD GR4,GR4」で分岐条件を判定しています。

“GR4”が正の時に分岐する命令は、「JNZ」と「JPL」
“GR4”が0の時に分岐する命令は、「JZE」
“GR4”が負の時に分岐する命令は、「JNZ」
です。

正の時に分岐すると仮定すると、正解が二個になってしまうので正しくありません。「JPL」は除外されます。

「JZE」か「JNZ」か?
「行番号32」で“GR4”を参照しているので、“GR4”が0の時分岐(「JZE」)することとなります。


3.  分岐先の絞り込み
分岐先を絞り込むにあたっては、分岐元のないラベルを捜します。

ラベル"FIN"に分岐する命令が存在していません。
ラベル"FIN"に分岐する命令の可能性が高くなります。

分岐命令は、「JZE」で「ビット長」が0の時に分岐するので、"FIN"への分岐が正解となります。

4.  正答は?
「オ JZE FIN」が正解となります。

設問2 e,f

[再編成前のモジュール構成]








[再編成後のモジュール構成]










[選択肢 e]


[解き方]

1.  設問の意図を汲み取る
「プログラム1」のモジュール名が、BITSONからBITSOPに変更されるので、「イBITSOP」が正解となります。

[選択肢 f]


1.  設問の意図を汲み取る
「プログラム3」は、“GR7”に“SETOP”のアドレスを設定して「プログラム1」を呼び出すので、「CALL 0,GR7」で目的の“SETOP”を実行できる。

「オ 0,GR7」が正解となります。


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


設問1のa 

“穴埋め箇所”付近のコメントに着目

コメント(行番号45)には、以下のように記載されています。
「ビット位置(GR3)」を「相対アドレス(GR2)」に変換

3
4
5
6
7
8
LD     GR3,1,GR1    ; GR3:ビット位置
; ビット位置を,相対アドレス(GR2)
; ビットインデックス(GR3)とに変換
LD     GR2,GR3
[  a  ]
AND    GR3,=#O00F

“相対アドレス”とは

相対アドレスの説明は、〔プログラムの説明〕に記載されています。
相対アドレスは、「ビット位置」を16で割ることで得られることが分ります。


該当する選択肢は?

「ビット位置」を16で割る処理に該当する選択肢は、「オ SRL GR2,4」になります。

SLL GR2,O,GR3
SLL GR2,4
SLL GR2,4,GR3
SRL GR2,O,GR3
SRL GR2,4
SRL GR2,4,GR3

講評

本問は、穴埋め箇所周辺のプログラム解析だけで正解を得ることができます。

設問1のb


アセンブラのノウハウ

LD  GR3,GR3
GR3GR3に転送してどんな意味があるのか?
GR3GR3に転送することで、GR3に設定されている値に応じてフラグレジスタが変化します。

SUBL  GR3,GR3
GR30を設定する処理になります。

穴埋め箇所周辺のトレースで正解を得られるか?

穴埋め箇所周辺のトレースで正解を得られるかを確認してみます。
GR3の用法を把握する必要があり、正解が得られなさそうです。

16
17
18
19
LD     GR3,GR3      ; GR3の設定値は?
JZE    FULL         ; GR30ならFULLに分岐
[  b  ]
SUBL   GR3,GR3      ; GR30を設定

選択肢から正解を得られるか?

選択肢の内容から正解を得られる(または絞り込める)かを確認してみます。
GR5を更新していますが、GR5の用法を把握する必要があり、正解が得られなさそうです。

ADDL GR5,GR2
ADDL GR5,GR3
ADDL GR5,GR4
SUBL GR5,GR2
SUBL GR5,GR3
SUBL GR5,GR4

一旦、保留

プログラム全体のトレースを要するので、本問題の解析を保留します。

設問1のc


選択肢から正解を得られるか?

分岐先・分岐条件を問う問題では、選択肢に記載された分岐先と分岐条件を整理します。

JNZ FIN
JNZ LOOP
JPL FIN
JPL LOOP
JZE FIN
JZE LOOP

分岐先は?

分岐先が問われた場合、プログラムの中で分岐元のないラベルがないかを捜します。
本問の場合、「FIN」へ分岐する分岐命令がなく、FINに分岐する選択肢が正解である可能性が高くなります。

分岐条件は?

プログラムを確認すると、GR4の設定値に従って分岐することが分ります。

27
28
BREAK  LD GR4,GR4  ;操作の対象になる未処理のビットあり?
       [  c  ]

GR4って何?

GR4を更新する箇所を抽出してみます。
GR4にはビット長が格納されていることが分ります。
ビット長は、初期値が正(非ゼロ)で、減算されていく変数ですので、JNZJPLでは同じ結果が得られてしまい選択肢として不適切です。JZEが正解となります。


9
20
27
28
      LD   GR4,2,GR1 ;GR4:ビット長(初期値)
FULL  SUBL GR4,GR5   ;操作するビット数だけビット長を減らす
BREAK LD GR4,GR4  ;操作の対象になる未処理のビットあり?
      [  c  ]

分岐先は?

ビット長が0になった時の分岐先としては、FINが妥当です。
以上より、正解は「オ JZE FIN」となります。

講評

本問は、分岐判断に使用される汎用レジスタの用途を解析だけで正解を得ることができます。

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

設問1のa、b

問われている内容は?

分岐先(LOOP12LOOP13)・分岐条件(JUMPJMIJPLJZE)は?

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
IEND    LD   GR3,=9
        LD   GR0,=#7FFF       ;最大値
L00P12  LD   GR2,GR0
        LD   GR4,=9
L00P13  CPA  GR2,T0TAL,GR4
        JPL  CHANGE
        JUMP NEXT
CHANGE  LD   GR2,T0TAL,GR4   ;GR2←新たなタイムの最小値
        LD   GR1,GR4           ;GR1←そのチーム番号
NEXT    SUBA GR4,=1
        [  a  ]
        SRL  GR2,3             ;平均タイム
        CALL 0UTPUT
        ST   GR0,T0TAL,GR1     ;処理済みとして最大値を設定
        SUBA GR3,=1
        [  b  ]

JMI  LOOP12
JMI  LOOP13
JPL LOOP12
JPL LOOP13
JUMP LOOP12
JUMP LOOP13
JZE LOOP12
JZE LOOP13

分岐先と分岐条件は?

[  a  ][  b  ]に、「JUMP」が入ると、[  a  ][  b  ]の次の行が実施されなくなるので、「JUMP」は除外されます。

LOOP13へ分岐する選択肢は、「イ JMI  LOOP13」「エ JPL LOOP13」「イ JZE LOOP13」が残ります。
LOOP12へ分岐する選択肢は、「ア JMI  LOOP12」「ウ JPL LOOP12」「キ JZE LOOP12」が残ります。

[  a  ]の分岐先および分岐条件は?

[  a  ]は、前行(「SUBA GR4,=1」)の演算結果により分岐していますので、GR4の用途を確認します。
行番号11で初期値9(9チーム)を設定し、行番号171ずつ減算しています。

[  a  ]の分岐先は、行番号12LOOP13)と考えられます。
9チーム分の処理を行うので、GR4が正の間ループを繰り返します。
よって、正解は「JPL LOOP13」となります。

[  b  ]の分岐先は?

 [  b  ]は、前行(「SUBA GR3,=1」)の演算結果により分岐していますので、GR3の用途を確認します。
行番号8で初期値9(9チーム)を設定し、行番号221ずつ減算しています。

[  b  ]の分岐先は、行番号10LOOP12)と考えられます。
9チーム分の処理を行うので、GR3が正の間ループを繰り返します。
よって、正解は「JPL LOOP12」となります。

講評

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

設問2のc


問われている内容は?

プログラムの実行結果

20
        CALL 0UTPUT

チーム番号の昇順に出力される
チーム番号の降順に出力される
どのチームが先に出力されるかは時々である



プログラムをトレースする

1
2
3
4
5
6
7
RACE    START
L00P11  CALL INPUT ;GR0(0:OK,-1:EOF), GR1:チーム番号, GR2:タイム
        LD   GR0,GR0 ;EOF?
        JMI  IEND
        ADDA GR2,T0TAL,GR1 ;GR2←GR2+TOTAL[GR1]
        ST   GR2,T0TAL,GR1 ;TOTAL[GR1]←GR2
        JUMP L00P11

チーム毎の合計タイムをTOTAL(配列)に格納
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
IEND    LD   GR3,=9    ;LOOPの初期値設定
        LD   GR0,=#7FFF;最小値の初期値(7FFFより小さい値検出したら更新)
L00P12  LD   GR2,GR0  ;GR2=GR0=検出済最小値
        LD   GR4,=9    ;LOOPの初期値設定
L00P13  CPA  GR2,T0TAL,GR4 ; 検出済最小値とチーム別合計値を比較
        JPL  CHANGE    ;チームの合計値の方が小さいなら最小値更新
        JUMP NEXT      ;次のチーム
CHANGE  LD   GR2,T0TAL,GR4   ;GR2←新たなタイムの最小値
        LD   GR1,GR4           ;GR1←そのチーム番号
NEXT    SUBA GR4,=1
        [JPL  LOOP13]
        SRL  GR2,3           ;平均タイム
        CALL 0UTPUT         ;最小値から順に出力
        ST   GR0,T0TAL,GR1 ;最小値を取り出したチームの合計値に
        SUBA GR3,=1         ;処理済みとして最大値(#7FFF)を設定
        [JPL  LOOP12]
        RET
T0TAL   DC 0,0,0,0,0,0,0,0,0,0 ;(チーム数+1)個の領域
        END

全チームの合計値を9周チェック
   全チームの合計値をNo.9No.1へと順にチェック
      順に検索し小さい方のタイムを記録
   全チームチェック終了
   得られた最も小さいタイムを出力
   最も小さいタイムを#7FFFで上書きして消す
9つのチームタイム出力まで継続

昇順って?

図2の出力結果は、昇順に出力された結果であると記載されている。

時間が同じである場合、行番号15~行番号16が実行されないので、チーム番号が大きい方が先に出力される。大きい方が先に出力されるので、「イ チーム番号の降順に出力される」が正解となります。

講評

設問2の正答率は低く、あまり理解されていなかった。アと誤って解答した受験者が多く見受けられた。領域を後ろから検査しているので、チーム番号の降順に出力されることに気がつけば、正答できた。

設問3のd


問われている内容は?

分岐先(LOOP21LOOP22)・分岐条件(JUMPJMIJPLJZE)は?

7
8
9
10
11
12
13
14
        LD   GR5,=3          ;ループ回数
L00P21  LD   GR6,DIVIS0R,GR4 ;GR6←除数
        LD   GR7,=0          ;GR7←
L00P22  CPA  GR2,GR6
        JMI  SETTIME
        SUBA GR2,GR6
        ADDA GR7,=1
        [  d  ]

JMI  LOOP21
JMI  LOOP22
JPL  LOOP21
JUMP LOOP21
JUMP LOOP22
JZE  LOOP22

[  d  ]の分岐先および分岐条件は?

[  d  ]は、前行(「ADDA GR7,=1」)の演算結果により分岐していますので、GR7の用途を確認します。
行番号9で初期値0を設定し、行番号131ずつ加算しています。

演算結果は常に正なので、JMI,JPL,JZEの命令は不適です。
「エ JUMP LOOP21」「オ JUMP LOOP22」のいずれかとなります。
初期値は行番号9で設定しているので、行番号10に分岐する「オ JUMP LOOP22」が正解となります。

講評

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

設問3のd


問われている内容は?

分岐先(LOOP21LOOP22)・分岐条件(JUMPJMIJPLJZE)は?

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        LD   GR5,=3          ;ループ回数
L00P21  LD   GR6,DIVIS0R,GR4 ;GR6←除数
        LD   GR7,=0          ;GR7←
L00P22  CPA  GR2,GR6
        JMI  SETTIME
        SUBA GR2,GR6
        ADDA GR7,=1
        [  d  ]
SETTIME 0R   GR7,=#0030
        ST   GR7,0,GR3
        ADDA GR4,=1
        ADDA GR3,=1
        SUBA GR5,=1
        [  e  ]
        0R   GR2,=#0030

JMI  LOOP21
JPL  LOOP21
JPL  LOOP22
JUMP LOOP22
JZE  LOOP21
JZE  LOOP22

[  e  ]の分岐先および分岐条件は?

[  e  ]は、前行(「SUBA GR5,=1」)の演算結果により分岐していますので、GR5の用途を確認します。
行番号7で初期値3を設定し、行番号191ずつ減算しています。

JUMP命令ですと行番号21が実行されなくなるので除外されます。

初めて[ e ]が実行された時に、分岐したいので、分岐条件は「JPL」に絞り込まれます。
「イ JPL  LOOP21」「ウ JPL  LOOP22」のいずれかとなります。

初期値は行番号7で設定しているので、行番号8に分岐する「イ JPL  LOOP21」が正解となります。

講評

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

設問4


問われている内容は?

分岐先(LOOP21LOOP22)・分岐条件(JUMPJMIJPLJZE)は?

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        LD   GR5,=3          ;ループ回数
L00P21  LD   GR6,DIVIS0R,GR4 ;GR6←除数
        LD   GR7,=0          ;GR7←
L00P22  CPA  GR2,GR6
        JMI  SETTIME
        SUBA GR2,GR6
        ADDA GR7,=1
        [JUMP LOOP22]
SETTIME 0R   GR7,=#0030
        ST   GR7,0,GR3
        ADDA GR4,=1
        ADDA GR3,=1
        SUBA GR5,=1
        [JPL  LOOP21]
        0R   GR2,=#0030

7
2
7
0
8

9
17
20
270
299

DIVISORの構造は?

行番号8で除数が格納されたテーブル(DIVISOR)をアクセスしています。
除数が格納されたテーブルには、6006010が格納されています。

2708」は、「2×6007×600×10+「余り8」を意味します。

除算回数は、2709となります。正解は「9」となります。

講評

設問4の正答率は低く、あまり理解されていなかった。イ又はウと誤って解答した受験者が見受けられた。
2708のうちの、27を求めるためには、2+7=9回実行する必要があることに気がつけば、正答できた。



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

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