アセンブラ 過去問の解き方(平成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の正答率は高く、よく理解されていた。



講評

各試験の講評です

平成30年度秋期

問12では、基準日から指定された日付までの日数を求めるプログラムについて出題した。

設問1
aの正答率は低く、あまり理解されていなかった。オと誤って解答した受験者が見受けられた。LAD命令とLD命令の違いを理解していれば、正答できた。
bとcの正答率は平均的で、おおむね理解されていた。
dの正答率は低く、あまり理解されていなかった。イと誤って解答した受験者が見受けられた。年を100で割り切れるかどうかを判定するために副プログラムDIVISIBLを呼び出し、その戻り値が0であれば、100で割り切れきれないことが分かり、うるう年であることが確定する。副プログラムLEAPYEARは、うるう年の場合、その戻り値が1でなければならないので、DIVISIBLの戻り値0を反転させ、1を戻り値として戻る。イでは、DIVISIBLの戻り値が変わらないので、正しい判定ができないことに注意が必要である。

設問2
eの正答率は低く、あまり理解されていなかった。GR0でその年の日数を求めるので、計算過程で1年の日数を超えない値であることが理解できれば、正答できた。
fの正答率は高く、よく理解されていた。

LAD命令とLD命令との違い、XOR命令によるビットの反転など、命令の機能を正しく理解して使用できるようにしてほしい。


平成30年度春期

問12では、整数を表す数字から成る文字列(数字列)の数値への変換、文字列からの数字列の抽出及び整数の乗算、を行うプログラムの作成について出題した。

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

設問2の正答率は低く、あまり理解されていなかった。
bでは、オ又はカと誤って解答した受験者が見受けられた。
取り出した文字が空白(数字列の区切り)でなければ、数字の処理を続けることに気がつけば、正答できた。

cでは、ウ又はオと誤って解答した受験者が見受けられた。
数字列の処理中でなければ(数値に変換する数字列がなければ)、副プログラムSETWDから何もせずに戻ることに気がつけば、正答できた。

dでは、イ又はウと誤って解答した受験者が見受けられた。
管理テープルに数字を格納したので、格納位置を次に進めなければならないことに気がつけば、正答できた。

設問3ではeの正答率は平均的で、おおむね理解されていた。
fの正答率は低く、あまり理解されていなかった。イ又はウと誤って解答した受験者が見受けられた。
整数の乗算の過程で、乗数の各ピットの値を下位桁から順に調べていることに気がつけば、正答できた。

コンピュータが周辺機器と数値のデータをやり取りする場合、文字列を介して行うことが多いので、アセンブラプログラムでの数字列の処理方法を習得しておいてほしい。また、アセンブラプログラムでは乗算プログラムを作成することが多々あるので、その処理方法を習得しておいてほしい。


平成29年度秋期

問12では、ビット列の検索・置換を行うプログラムの作成について出題した。

設問1の正答率は平均的で、おおむね理解されていた。
aでは、アと誤って解答した受験者が見受けられた。
二つのレジスタの内容一致をどのようにして判定するかが理解できれば、正答できた。

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

設問3の正答率は低く、あまり理解されていなかった。
cでは、ア又はウと誤って解答した受験者が見受けられた。cの次の行を実行した後でGR2の内容が"p-16"になることに気がつけば、正答できた。
dでは、ウ又はオと誤って解答した受験者が見受けられた。dの次の行でGR2の内容を格納していることから、最終的にGR2の内容がどのように構成されるのかを理解し、その過程を追跡できれば、正答できた。

設問4の正答率は低く、あまり理解されていなかった。ウと誤って解答した受験者が見受けられた。置換すべきビット列が2語にまたがったときの2語目用のマスクについて、具体的に考えてみれば、正答できた。

アセンブラプログラムにおいて、ビットを操作する処理はよく行われるので、シフトの使い方やマスクの使い方について習得しておいてほしい。


平成29年度春期

問12では、1語が16ビットであるコンピュータのアセンブラ言語において、32ビット長や64ビット長の整数の演算を行うプログラムの作成について出題した。

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

bの正答率は低く、あまり理解されていなかった。イと誤って解答した受験者が見受けられた。(GR3)の初期値が(GR1)+3であることや、ループの繰返し回数が4回であることに気がつけば、正答できた。

cの正答率は高く、よく理解されていた。設問2の正答率は低く、あまり理解されていなかった。ウと誤って解答した受験者が見受けられた。16進数も10進数と同様に、同じ桁同士を加算し、基数(16)以上の値になれば桁上がりすることを理解していれば、正答できた。アセンブラ言語では16進数による表現を多用するので、慣れておいてほしい。

設問3の正答率は低く、あまり理解されていなかった。

eでは、ウ又はエと誤って解答した受験者が見受けられた。eに当てはめた条件分岐命令の条件成立時、不成立時それぞれにおいてアクセスするメモリアドレスに注目すれば、正答できた。

fでは、キと誤って解答した受験者が見受けられた。乗算は左シフトと加算で、1ビット左シフトは被シフト数の加算でそれぞれ実現できることを踏まえ、fの次のCALLADD64が1ビット左シフトに相当することに気がつけば、正答できた。ある演算を別の演算に置き換える手法はアセンブラ言語によるプログラミングでは頻繁に用いられるので、よく理解しておいてほしい。



平成28年度秋期

問12では、リストに対して、要素を挿入又は削除するプログラムの作成について出題した。
全ての設問において、正答率は低く、あまり理解されていなかった。

設問1のaではイと誤って解答した受験者が多く見受けられた。
また、ウ又はオと誤って解答した受験者が見受けられた。
GR1とGR2の役割と“要素をたどる"という操作の意味が理解できれば、正答できた。
bではア又はイと誤って解答した受験者が見受けられた。
直前の命令で、GR2に、新たに挿入される要素の先頭アドレスが得られていることに気がつけば、正答できた。
cではウ又はエと誤って解答した受験者が見受けられた。
ここでも、GR2の役割が理解できれば、正答できた。

設問2では、ア又はイと誤って解答した受験者が見受けられた。
GR2は、但し、GR4に退避された後、行番号15で新たに挿入される要素の1語目が設定されることに気がつけば、正答できた。

設問3では、オ以外に解答が分散した。
主記憶上に展開されたリストを、図示するなどの工夫をしてイメージできれば、正答できた。
リストは最も基本的なデータ構造の一つであり、実装と操作について理解しておくことは非常に重要である。
ぜひ習得しておいてほしい。




平成28年度春期

問12では、10,000m競走のチーム別成績を上位から順に出力するプログラムの作成について出題した。

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

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

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

設問4の正答率は低く、あまり理解されていなかった。イ又はウと誤って解答した受験者が見受けられた。
2708のうちの、2と7を求めるためには、2+7=9回実行する必要があることに気がつけば、正答できた。
アセンブラプログラムにおいて、データの検索や、2進数から文字列への変換は、基本的な処理なので、身につけておいてほしい。


アセンブラの技

処理高速化のため、アセンブラでは独特な技が使用されます。
ソース中に出てきてあわてないように、事前に技を覚えておきましょう。

0設定

0設置方法として、以下の操作が行われます。

  • LD      GR1,=0
  • SUBA  GR1,GR1(平成30年秋問題)
  • LAD    GR1,0    (平成30年春問題)

除算

2の倍数で除算した際に、余りが発生するかどうかの判定方法として、以下の操作が行われます。
AND  GR1,=3
JZE   AMARINASHI(平成30年秋問題)

ビットON/OFF判定

ビットのON/OFF判定には、ANDを使用します。
AND  GR1,=1
JNE   BITON

ビット反転

ビットの反転には、XORを使用します。
XOR  GR1,=1

比較


比較で使用できる命令には、以下の3種類があります。
l  CPA/CPL
l  SUBA/SUBL
l  XOR

一致したデータをXOR演算すると0になり、JZEで分岐できます。(平成29年秋問題)

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

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