令和元年秋期
設問1-a
穴埋め部分
03 ST GR1,A
06 [ a ]
07 ST GR1,RESULT ;符号部を退避
解答群
ア AND GR1,=#000F
イ AND GR1,=#F000
ウ AND GR1,=#FFFF
エ OR GR1,=#000F
オ OR GR1,=#F000
カ OR GR1,=#FFFF
正解
ア AND GR1,=#000F
解答方法
次ステップのコメント「符号部を退避」に着目します。「符号部」を
RESULT
に格納できる命令は「ア AND GR1,=#000F」だけですので、「ア」が正解となります。解答群の解説
ア AND GR1,=#000F
GR1に
#246C
が設定されている状態で本命令を実行すると、GR1は#000C
となり、符号部を取り出せます。イ AND GR1,=#F000
GR1に
#246C
が設定されている状態で本命令を実行すると、GR1は#2000
となり、符号部が0クリアされてしまいます。ウ AND GR1,=#FFFF
何も変化しません。
無意味な命令です。
エ OR GR1,=#000F
GR1に
#246C
が設定されている状態で本命令を実行すると、GR1は#246F
となり、破壊されてしまいます。オ OR GR1,=#F000
GR1に
#246C
が設定されている状態で本命令を実行すると、GR1は#F46C
となります。カ OR GR1,=#FFFF
GR1に
#246C
が設定されている状態で本命令を実行すると、GR1は#FFFF
となり、破壊されてしまいます。設問1-b
穴埋め部分
15 ADDL GR1,GR2
16 CPL GR1,=10 ;10以上の場合は桁上げ
17 [ b ]
解答群
ア JMI MERGE
イ JNZ MERGE
ウ JPL MERGE
エ JOV MERGE
オ JZE MERGE
正解
ア JMI MERGE
解答方法
前ステップのコメント「10以上の場合は桁上げ」に着目します。解答群の中で、
GP1<10
とGP1≧10
で処理を分岐できる命令は「ア JMI MERGE」だけですので、「ア」が正解となります。解答群の解説
ア JMI MERGE
MERGE
に分岐する条件は、GR1<10の時です。GR1≧10の時は分岐しません。イ JNZ MERGE
MERGE
に分岐する条件は、GR1≠10の時です。GR1=10の時は分岐しません。ウ JPL MERGE
MERGE
に分岐する条件は、GR1>10の時です。GR1≦10の時は分岐しません。エ JOV MERGE
CPL命令では、フラグレジスタのOFフラグは設定されません。無意味な命令です。
オ JZE MERGE
MERGE
に分岐する条件は、GR1=10の時です。GR1≠10の時は分岐しません。設問1-c
穴埋め部分
20 [ c ]
21 OR GR1,RESULT ;中間結果との併合
解答群
ア SLA GR1,0,GR3
イ SLL GR1,0,GR3
ウ SLL GR1,=4
エ SRA GR1,0,GR3
オ SRL GR1,0,GR3
カ SRL GR1,=4
正解
イ SLL GR1,0,GR3
解答方法
LD GR1,A
SRL GR1,0,GR3
LD GR2,B
SRL GR2,0,GR3
AND GR1,=#000F
AND GR2,=#000F
ADDL GR1,GR2
[ c ]
OR GR1,RESULT
パック10進数をメモリAから取り出し、その値を右方向に論理シフト(シフト量:GR3)し、最後に再びRESULTに格納しています。右方向にシフトした場合、計算結果が失われてしまうため、「エ」「オ」「カ」は除外されます。
SRL GR2,0,GR3
で右シフトした値を左シフトする命令を選択するのだが、「イ SLL GR1,0,GR3
」が最もSRL GR2,0,GR3
に近い。ソーストレース後の解答方法
本か所では、以下のように処理が行われています。
メモリA/Bに退避されたパック10進数を取り出し、計算対象桁を最下位の4ビットに設定します。
再下位4ビットに設定された値を加算して、再びパック10進数の形式に戻(左シフト)します。
最後に、RESULTに格納されたパック10進数とマージします。
解答群の解説
ア SLA GR1,0,GR3
GR3の初期値は4(LAD GR3,4)で、4づつ加算(LAD GR3,4,GR3)されています。
CPL GR3,16
で処理終了するので、GR3には、4,8または12が設定されます。算術シフトの場合、“80”を左に12ビットシフトできません。
イ SLL GR1,0,GR3
左方向のシフト(シフト量:GR3)
ウ SLL GR1,=4
左方向のシフト(シフト量:4)
エ SRA GR1,0,GR3
右方向の算術シフト(シフト量:GR3)
AND GR1,=#000F
AND GR2,=#000F
ADDL GR1,GR2
で下位4ビットに設定された加算結果を右シフトすると、加算結果が失われてしまいます。オ SRL GR1,0,GR3
右方向の論理シフト(シフト量:GR3)
AND GR1,=#000F
AND GR2,=#000F
ADDL GR1,GR2
で下位4ビットに設定された加算結果を右シフトすると、加算結果が失われてしまいます。カ SRL GR1,=4
右方向の論理シフト(シフト量:4)
AND GR1,=#000F
AND GR2,=#000F
ADDL GR1,GR2
で下位4ビットに設定された加算結果を右シフトすると、加算結果が失われてしまいます。設問2-d
穴埋め部分
03 CPL GR1,GR2
04 [ d ]
05 LD GR4,GR1
06 LD GR1,GR2
07 LD GR2,GR4
解答群
ア JMI INI
イ JNZ INI
ウ JOV INI
エ JPL INI
オ JZE INI
正解
エ JPL INI
解答方法
穴埋個所の次の3ステップでは、G1とG2を入れ替えています。このことを踏まえて、解答群の各命令を検証すると、「ア」と「エ」に絞り込まれます。
ST GR1,RESULT ;符号部を退避
にて、GR1の符号が有効となっているので、GR1<GR2の時にG1とG2を入れ替える「エ」が正解となります。解答群の解説
ア JMI INI
GR1<GR2の時に分岐し、GR1≧GR2の時にG1とG2を入れ替えます。
イ JNZ INI
GR1≠GR2の時に分岐し、GR1=GR2の時にG1とG2を入れ替えます。
G1とG2の入れ替え処理は、無駄な処理となってしましまいます。
ウ JOV INI
CPL命令では、フラグレジスタのOFフラグは設定されません。無意味な命令です。
エ JPL INI
GR1>GR2の時に分岐し、GR1≦GR2の時にG1とG2を入れ替えます。
オ JZE INI
GR1=GR2の時に分岐し、GR1≠GR2の時にG1とG2を入れ替えます。
GR1とGR2の入れ替えを行っても、GR1とGR2の関係はGR1≠GR2のままで変化しません。
設問2-e
穴埋め部分
20 SUBL GR1,GR2
21 JPL MERGE2
22 [ e ]
23 ADDL GR1,=10
解答群
ア JMI MERGE
イ JNZ MERGE
ウ JOV MERGE
エ JZE MERGE
オ SLL GR1,0,GR3
カ SRL GR1,0,GR3
正解
エ JZE MERGE
解答方法
本穴埋め個所は、プログラム1の[ b ]の穴埋め個所に相当しています。プログラム1のコメント(10以上の場合は桁上げ)から、本穴埋め個所は、
「0未満の場合は桁下げ」
の処理を行うものと推測されます。
解答群の中で、0以上と0未満で処理を分岐できる命令は「エ JZE MERGE」だけですので、「エ」が正解となります。
「ア」「イ」「ウ」は、動作結果が同じになるので、除外されます。
解答群の解説
ア JMI MERGE
SUBL GR1,GR2
JPL MERGE
JMI MERGE
の場合、減算結果が0の時だけ、ADDL GR1,=10
が実行される。
イ JNZ MERGE
SUBL GR1,GR2
JPL MERGE
JNZ MERGE
の場合、減算結果が0の時だけ、ADDL GR1,=10
が実行される。
「ア」と同じ結果が得られる。
JPL MERGE
は無駄な処理となる。ウ JOV MERGE
SUBL GR1,GR2
JPL MERGE
JOV MERGE
の場合、減算結果が0の時だけ、ADDL GR1,=10
が実行される。
「ア」と同じ結果が得られる。
(SUBLは論理減算なので、0未満になった時にフラグレジスタのOFフラグが設定される)
エ JZE MERGE
SUBL GR1,GR2
JPL MERGE
JZE MERGE
の場合、減算結果が負の時だけ、ADDL GR1,=10
が実行される。
オ SLL GR1,0,GR3
SUBL GR1,GR2
JPL MERGE
SLL GR1,0,GR3
の場合、減算結果が0または負の時に、SLL GR1,0,GR3
ADDL GR1,=10
が実行される。
カ SRL GR1,0,GR3
SUBL GR1,GR2
JPL MERGE
SRL GR1,0,GR3
の場合、減算結果が0または負の時に、SRL GR1,0,GR3
ADDL GR1,=10
が実行される。
設問2-f
穴埋め部分
20 SUBL GR1,GR2
34 SRL GR2,0,GR3
35 [ f ]
36 JUMP LOOP2
解答群
ア ADDA GR1,GR0
イ ADDL GR1,=1
ウ ADDL GR1,GR0
エ ADDL GR3,GR0
オ SUBL GR1,=1
カ SUBL GR1,GR0
正解
カ SUBL GR1,GR0
解答方法
プログラム2は、プログラム1を流用改造しています。プログラム1とプログラム2とで、本穴埋め個所周辺を比較します。
プログラム1
ADDL GR1,GR2
(略)
ADDL GR1,GR0
JUMP LOOP
プログラム2SUBL GR1,GR2
(略)
[ f ]
JUMP LOOP
プログラム1のADDL GR1,GR0
に相当する命令が穴埋め個所に入ると推定されます。このことを踏まえて、解答群の各命令を検証すると、「ア ADDA GR1,GR0」または「カ SUBL GR1,GR0」の可能性が高いと推定されます。
ソーストレース後の解答方法
本か所は、下位桁の計算で発生した桁下がり量を反映する個所です。
桁下がり量は、GR0に設定(0または1)されています。
桁下がり量を反映するには、減算操作が必要です。
よって、正解は、「カ SUBL GR1,GR0」となります。
注意
減算対象のGR1に0が設定されていて、1減算したことで桁下がりが発生することに対する考慮がなされていません。
解答群の解説
ア ADDA GR1,GR0
桁下がり量を加算しています。
イ ADDL GR1,=1
無条件に1加算しています。
ウ ADDL GR1,GR0
桁下がり量を加算しています。
エ ADDL GR3,GR0
GR3には、桁をシフトするシフト量が設定されています。
オ SUBL GR1,=1
無条件に1減算しています。
カ SUBL GR1,GR0
桁下がり量を減算しています。
設問3-g
穴埋め部分
02 LD GR0,GR1
03 [ g ]
04 SRL GR0,1
解答群
ア ADDL GR1,=1
イ AND GR0,GR2
ウ OR GR1,GR2
エ SUBL GR1,=1
オ XOR GR0,GR2
正解
オ XOR GR0,GR2
解答方法
パック10進数の符号差異は、最下位ビットの差異で確認できます。「ア」~「エ」では、符号差を認識することはできません。
解答群の解説
ア ADDL GR1,=1
符号部に1を加算しています。符号が’D’の時に1を加算すると、符号部には未定義の値が格納されてしまいます。
イ AND GR0,GR2
GR1とGR2の最下位ビットがともにOFFの時、GR0の最下位ビットはOFFになります。
GR1とGR2の最下位ビットの一方がONで他方がOFFの時、GR0の最下位ビットはOFFになります。
結果が同じなので、符号差を認識できません。
ウ OR GR1,GR2
GR1とGR2の最下位ビットがともにONの時、GR0の最下位ビットはONになります。
GR1とGR2の最下位ビットの一方がONで他方がOFFの時、GR0の最下位ビットはONになります。
結果が同じなので、符号差を認識できません。
エ SUBL GR1,=1
符号部から1を加算しています。符号が’C’の時に1を減算すると、符号部には未定義の値が格納されてしまいます。
オ XOR GR0,GR2
GR1とGR2の最下位ビットが同じ時、GR0の最下位ビットはOFFになります。
GR1とGR2の最下位ビットの一方がONで他方がOFFの時、GR0の最下位ビットはONになります。
結果が異なるので、符号差を認識できます。
設問3-h
穴埋め部分
02 LD GR0,GR1
03 XOR GR0,GR2
04 SRL GR0,1
05 [ h ]
06 CALL ADDP1
解答群
ア JMI P2
イ JNZ P2
ウ JOV P2
エ JPL P2
オ JZE P2
正解
ウ JOV P2
解答方法
「ウ」を除く命令では、常に分岐するか、常に分岐しないので、無意味な命令です。解答群の解説
ア JMI P2
右に論理シフトなので、最上位ビットは0となり、常に分岐しません。
イ JNZ P2
符号部は“C”または“D”なので、右に1ビットシフトした結果は、常に0ではありません。
常に分岐してしまいます。
ウ JOV P2
符号差がある場合、
XOR GR0,GR2
最下位ビットに1が設定されます。SRL GR0,1
を実行することで最下位ビットがフラグレジスタのOFに反映されます。エ JPL P2
右に論理シフトなので、最上位ビットは0となり、常に分岐します。
オ JZE P2
符号部は“C”または“D”なので、右に1ビットシフトした結果は、常に0ではありません。
常に分岐しません。