令和元年度秋期 基本情報技術者試験(FE)の午後問題12(CASL)は、
- 16ビットのパック10進数を加算するプログラム
に関する問題でした。
プログラム例(r01a_fe_pm12.casl
)
aに関する解答群について
空欄aの次の行で符号部の退避処理を行っていることから、符号部だけを取り出す処理を選択する必要があります。
bに関する解答群について
23行目で加算処理を行っていますが、各桁を足して10以上だと、空欄bの次行からの処理(10を引いて1桁にし、桁上がりの発生をGR0
に記録)が必要になります。逆に10未満だと、この処理をスキップしたいので空欄bはJMI MERGE
を選択することになります。
cに関する解答群について
空欄cの次行で中間結果との併合処理を行うためにGR3
ビットだけ左にシフトしておく必要があります。
dに関する解答群について
空欄dの次行から3ステップかけて、GR1
とGR2
の入れ替え処理があります。58行目でGR1
の符号部をRESULT
領域に保存するということは、GR1
とGR2
の絶対値の大きい方がGR1
に入っていなければいけないということになります。
eに関する解答群について
66行目で、各桁の減算処理を行っていますが、引いた結果が0未満のときは、空欄eの次行からの処理(10を足して正の数にし、繰り下がりの発生をGR0
に記録)が必要になります。逆に0以上のときは、この処理をスキップしたいので空欄eはJZE MERGE
を選択することになります。
fに関する解答群について
77行目から80行目で、次の減算対象を数値を作り、そして空欄fで繰り下がりの分を考慮するために、SUBL GR1,GR0
の選択ということだったのでしょうが、GR1
が0の場合に不具合が起こることから問題誤りということになったんでしょうね。
gに関する解答群について
プログラム3は、2つの数値の符号を調べて、ADDP1
で処理するのかADDP2
で処理するのかを選択するプログラムになっています。空欄gの次行でGR0
を右に1ビット論理シフトした結果で分岐を行っているのですが、2つの数のLSB(符号)の違いを検出するためには、排他的論理和をとると良さそうですね。
hに関する解答群について
空欄hの上の行で、2つの数の正負が異なるときにはオーバフローが発生し、そのときはADDP2
で処理を行いたいのでJOV P2
を選択することになります。
実行結果
作成したプログラムを「CASLシミュレータ(CASL II 対応)」で実行してみました。6行目と7行目に二つの16ビットパック10進数を指定します。
#246C + #057C
問題文の図2のようにGR0
に303C
がセットされました。
#246C + #025D
+246+(-25)
の計算ですが、GR0
に+221
がセットされています。
#206C + #027D(計算できないパターン)
GR0
が2D9C
となってパック10進数ではなくなっています。2段階の繰り下がり(用語が正しいのか分かりません)が考慮されていないのがバグの原因ですね。