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

設問1のa

問われている内容は?

GR010倍するには?

9
10
11
12
13
SLL   GR0,1     ;GR010倍してGR4を加算
LD    GR5,GR0
[  a  ]
ADDL  GR0,GR5
ADDL  GR0,GR4

ADDL GR5,GR4
SLL GR4,1
SLL GR4,2
SLL GR5,1  
SLL GR5,2
 
 

GR4GR5か?

行番号13GR4を加算するので、GR4に変更を加える「イ」「ウ」は除外されます。

10倍するには?

アセンブラの乗算は、シフト命令と加算命令の組合せで行われます。

10倍値」は、「2倍値+8倍値」で得られます。
8倍値」は、「2倍値」を4倍すれば良いので、「オ SLL  GR5,2が正解となります。

9
10
11
12
SLL   GR0,1     ; GR0×22倍値)
LD    GR5,GR0   ; GR52倍値格納
[  a  ]          ; 2倍値から8倍値生成
ADDL  GR0,GR5   ; 2倍値+8倍値

講評

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

設問1のb


問われている内容は?

分岐先(FINLPNUM)・分岐条件(JNZJZE)は?

7
8
9
10
11
12
13
14
15
16
17
18
19
20
LP   LAD   GR6,1,GR6
     LD    GR4,0,GR6 ;1文字の取出し
     CPL   GR4,='.'
     JZE   FIN
     CPL   GR4,=' '
     [  b  ]
     CALL  SETWD
     JUMP  LP
NUM  LD    GR3,GR3   ;数字列の処理中?
     JZE   LP
     LD    GR3,=0    ;次の数字列の処理開始
     LD    GR1,GR6   ;数字列の先頭アドレスを退避
     JUMP  LP
FIN  CALL  SETWD

JNZ FIN
JNZ LP
JNZ NUM
JZE FIN
JZE LP
JZE NUM

分岐先は?

分岐先を問う問題では、分岐元のないラベルがないかを捜します。
NUMに分岐する分岐命令が存在しません。
行番号14が「JUMP  LP」ですので、分岐先は“NUM”となります。

分岐条件は?

'.'(ピリオド)や' '(空白)の検出は、文字列終了を意味し、「SETWD」が実行されます。
よって、' '(空白)以外時は“NUM”に分岐する「ウ JNZ NUM」が正解となります。

講評

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

設問1のc


問われている内容は?

分岐先(FINFIN2NUM)・分岐条件(JNZJZE)は?

5
       LD    GR3,=-1   ;数字列の処理状態フラグの初期化
17
       LD    GR3,=0    ;次の数字列の処理開始
25
26
27
28
29
30
31
32
33
SETWD  LD    GR3,GR3
       [  c  ]
       LD    GR2,GR6
       SUBL  GR2,GR1
       CALL  DTOB      ;数字列を数値に変換
       ST    GR0,0,GR7
       LD    GR3,=-1  ;フラグ初期化(0-1)
       [  d  ]
FIN2   RET

JNZ FIN
JNZ FIN2
JNZ NUM
JZE FIN
JZE FIN2
JZE NUM

分岐先は?

分岐先を問う問題では、分岐元のないラベルがないかを捜します。
FIN2に分岐する分岐命令が存在しないので、「イ JNZ FIN2」「オ JZE FIN2」が候補となります。

CALL命令で呼び出された処理はRET命令で復帰する必要があり、“FIN”,“NUM”は除外されます。

分岐条件は?

行番号25の命令が「LD GR3,GR3」ですので、分岐条件はGR3の状態で決まります。

プログラム全体で、GR3の用法を確認します。
GR3“0”の時、文字列処理中を表し、GR3“-1”の時、非処理中を表します。

非処理中(GR3=-1)の時は、“FIN2”に分岐するので、「 JNZ FIN2」が正解となります。

講評

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

設問1のd


問われている内容は?

更新するのはGR6GR7か?実効アドレスかデータか?

25
26
27
28
29
30
31
32
33
SETWD  LD    GR3,GR3
       [  c  ]
       LD    GR2,GR6
       SUBL  GR2,GR1
       CALL  DTOB      ;数字列を数値に変換
       ST    GR0,0,GR7
       LD    GR3,=-1
       [  d  ]
FIN2   RET

LAD GR6,1,GR1
LAD GR6,1,GR6
LAD GR7,1,GR2
LAD GR7,1,GR7
LD  GR6,GR1 
LD  GR7,GR2 

プログラム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
;IN:GR1(文字列格納領域アドレス)
;    GR2(管理テーブルアドレス)
GETWD   START
        RPUSH
        LD    GR6,GR1   ;GR6←文字列格納領域アドレス
        LD    GR7,GR2   ;GR7←管理テーブルアドレス
        LD    GR3,=-1   ;数字列の処理状態フラグの初期化
        LAD   GR6,-1,GR6;次行で+1するので-1
LP      LAD   GR6,1,GR6 ;文字列格納領域アドレス+1
        LD    GR4,0,GR6 ;1文字の取出し
        CPL   GR4,='.'  ;文字列の終端?
        JZE   FIN        ;終端ならFINに分岐
        CPL   GR4,=' '  ;文字列の区切り?
        [  b  ]
        CALL  SETWD     ;管理テーブルに格納
        JUMP  LP
NUM     LD    GR3,GR3   ;数字列の処理中?
        JZE   LP
        LD    GR3,=0    ;次の数字列の処理開始
        LD    GR1,GR6   ;数字列の先頭アドレスを退避
        JUMP  LP
FIN     CALL  SETWD     ;管理テーブルに格納
        LD    GR2,=-1
        ST    GR2,0,GR7 ;数値の終わりを示す印を格納
        RPOP
        RET
SETWD   LD    GR3,GR3    ;次の数字列の処理開始?
        [  c  ]
        LD    GR2,GR6
        SUBL  GR2,GR1  ;現数字列アドレス-先頭アドレス
        CALL  DTOB      ;数字列を数値に変換
        ST    GR0,0,GR7
        LD    GR3,=-1   ;数字列の処理状態フラグの初期化
        [  d  ]
FIN2    RET
        END

LAD GR6,1,GR1
LAD GR6,1,GR6
LAD GR7,1,GR2
LAD GR7,1,GR7
LD  GR6,GR1 
LD  GR7,GR2 

GR6GR7の用法を確認

GR6GR7の用法を確認します。
GR6の用法:文字列格納領域アドレスとして使用されています。行番号7で更新されています。
GR7の用法:管理テーブルアドレスとして使用されています。更新箇所がありません。
GR7を更新する「ウ」「エ」「カ」が候補となります。

GR2の用法を確認します。DTOBへの引数として数字列の長さが設定されていますので、「ウ」と「カ」は場外されます。「ウ」だと長さ+1がアドレスになってしまいます。「カ」だと長さがアドレスになってしまいます。
管理テーブルアドレスを+1する「LAD GR7,1,GR7」が正解となります。

講評

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

設問2のe


問われている内容は?

分岐先(FINNEXT)・分岐条件(JMIJPLJZE)は?

3
4
5
6
7
8
9
10
11
12
13
14
15
16
      LAD   GR2,CTBL
      CALL  GETWD
      LD    GR4,0,GR2 ;GR4←被乗数
      LD    GR5,1,GR2 ;GR5←乗数
      LD    GR0,=0
      LD    GR5,GR5
LP    [  e  ]
      LD    GR3,GR5
      AND   GR3,=#0001;乗数の最下位ビットのチェック
      JZE   NEXT
      ADDL  GR0,GR4
NEXT SLL   GR4,1     ;被乗数を1ビット左論理シフト
      [  f  ]
      JUMP  LP

JMI FIN
JMI NEXT
JPL FIN
JPL NEXT
JZE FIN
JZE NEXT

分岐先は?

分岐先を問う問題では、分岐元のないラベルがないかを捜します。
FINに分岐する分岐命令が存在しない、また、“NEXT”に分岐すると無限ループとなってしまうので、分岐先は“FIN”となります。

分岐条件は?

GR5には乗数が格納されており、「LD GR5,GR5」ではGR5の設定値をテストしています。
乗数が“0”の時FINに分岐するのが適しているので、正解は、「オ JZE FINとなります。

講評

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

設問2のf


問われている内容は?

穴埋め箇所に適した処理は?

3
4
5
6
7
8
9
10
11
12
13
14
15
16
      LAD   GR2,CTBL
      CALL  GETWD
      LD    GR4,0,GR2 ;GR4←被乗数
      LD    GR5,1,GR2 ;GR5←乗数
      LD    GR0,=0
      LD    GR5,GR5
LP    [  e  ]
      LD    GR3,GR5
      AND   GR3,=#0001;乗数の最下位ビットのチェック
      JZE   NEXT
      ADDL  GR0,GR4
NEXT SLL   GR4,1     ;被乗数を1ビット左論理シフト
      [  f  ]
      JUMP  LP

ADDL GR0,GR5
ADDL GR5,GR4
LD GR5,GR4
SLL GR5,1
SRL GR5,1

プログラム3のトレース

プログラムをトレースして、コメントを追記します。



1
2
3
4

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;IN GR1:文字列格納領域アドレス (GR1+0):被乗数、(GR1+1):乗数
;OUT GR0:演算結果
MULT  START 
     RPUSH    
      LAD   GR2,CTBL  ;GR2 ← CTBLアドレス
      CALL  GETWD     ;IN:GR1(文字列格納領域アドレス)
                       ;    GR2(管理テーブルアドレス)
      LD    GR4,0,GR2 ;GR4←被乗数(数値)
      LD    GR5,1,GR2 ;GR5←乗数(数値)
      LD    GR0,=0    ;復帰値(演算結果)の初期化
      LD    GR5,GR5  ;乗数(数値)
LP    [  e  ]
      LD    GR3,GR5  ;乗数
      AND   GR3,=#0001;乗数の最下位ビットのチェック
      JZE   NEXT
      ADDL  GR0,GR4   ;ビットON時、被乗数加算
NEXT SLL   GR4,1     ;被乗数を2倍
      [  f  ]         ;乗数を1/2
      JUMP  LP
FIN   PROP
      RET
CTBL  DS  3
      END

プログラムをトレースした結果、以下のように乗算していることが分ります。
(8(被乗数)×5(乗数)の場合を例に説明します。)

初期状態
GR0(演算結果)=0,GR4(被乗数)=8,GR5(乗数)=5
乗数の最下位ビット:ON
GR0(=8)←GR0(=0)+GR4(=8)
GR4(=16)←GR4(=8)×2
GR5(=2) ←GR5(=5)×1/2
乗数の最下位ビット:OFF

GR4(=32)←GR4(=16)×2
GR5(=1) ←GR5(=2)×1/2
乗数の最下位ビット:ON
GR0(=40)←GR0(=8)+GR4(=32)
GR4(=32)←GR4(=16)×2
GR5(=0) ←GR5(=1)×1/2
GR5=0で終了


この計算方法を実現できる命令は、「SRL GR5,1」になります。

この計算方法が思いつかなかった時

個々に妥当性を検証します。

演算結果は、被乗数の倍数になるので、本処理は不適切です。
ADDL GR0,GR5  ; 演算結果に乗数加算
乗数の情報が失われてしまいます。
ADDL GR5,GR4  ; 乗数に被乗数加算
乗数の情報が失われてしまいます。
LD GR5,GR4  ; 乗数に被乗数格納
「行番号11」を二度目以降に実行した場合、常にOFFとなってしまいます。
SLL GR5,1  ; 乗数を2

講評

fの正答率は低く、あまり理解されていなかった。イ(ADDL GR5,GR4)又はウ(LD GR5,GR4)と誤って解答した受験者が見受けられた。
整数の乗算の過程で、乗数の各ピットの値を下位桁から順に調べていることに気がつけば、正答できた。


0 件のコメント:

コメントを投稿

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

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