設問1のa
問われている内容は?
GR0を10倍するには?
|
9
10
11
12
13
|
SLL GR0,1 ;GR0を10倍して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
|
GR4かGR5か?
行番号13でGR4を加算するので、GR4に変更を加える「イ」「ウ」は除外されます。
10倍するには?
アセンブラの乗算は、シフト命令と加算命令の組合せで行われます。
「10倍値」は、「2倍値+8倍値」で得られます。
「8倍値」は、「2倍値」を4倍すれば良いので、「オ SLL GR5,2」が正解となります。
9
10
11
12
|
SLL GR0,1 ; GR0×2(2倍値)
LD GR5,GR0 ; GR5に2倍値格納
[ a ] ; 2倍値から8倍値生成
ADDL GR0,GR5 ; 2倍値+8倍値
|
講評
設問1の正答率は平均的で、おおむね理解されていた。
|
設問1のb
問われている内容は?
分岐先(FIN・LP・NUM)・分岐条件(JNZ・JZE)は?
|
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
問われている内容は?
分岐先(FIN・FIN2・NUM)・分岐条件(JNZ・JZE)は?
|
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
問われている内容は?
更新するのはGR6かGR7か?実効アドレスかデータか?
|
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
|
GR6とGR7の用法を確認
GR6とGR7の用法を確認します。
GR6の用法:文字列格納領域アドレスとして使用されています。行番号7で更新されています。
GR7の用法:管理テーブルアドレスとして使用されています。更新箇所がありません。
GR7を更新する「ウ」「エ」「カ」が候補となります。
GR2の用法を確認します。DTOBへの引数として数字列の長さが設定されていますので、「ウ」と「カ」は場外されます。「ウ」だと長さ+1がアドレスになってしまいます。「カ」だと長さがアドレスになってしまいます。
管理テーブルアドレスを+1する「エ LAD GR7,1,GR7」が正解となります。
講評
dでは、イ(LAD GR6,1,GR6)又はウ(LAD GR7,1,GR2)と誤って解答した受験者が見受けられた。
管理テープルに数字を格納したので、格納位置を次に進めなければならないことに気がつけば、正答できた。
|
設問2のe
問われている内容は?
分岐先(FIN・NEXT)・分岐条件(JMI・JPL・JZE)は?
|
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 件のコメント:
コメントを投稿