Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

令和元年度秋期基本情報午後問12

令和元年度秋期 基本情報技術者試験(FE)の午後問題12(CASL)は、

  • 16ビットのパック10進数を加算するプログラム

に関する問題でした。

f:id:rahaema:20191208213517p:plain

プログラム例(r01a_fe_pm12.casl)

aに関する解答群について

空欄aの次の行で符号部の退避処理を行っていることから、符号部だけを取り出す処理を選択する必要があります。

bに関する解答群について

23行目で加算処理を行っていますが、各桁を足して10以上だと、空欄bの次行からの処理(10を引いて1桁にし、桁上がりの発生をGR0に記録)が必要になります。逆に10未満だと、この処理をスキップしたいので空欄bはJMI MERGEを選択することになります。

cに関する解答群について

空欄cの次行で中間結果との併合処理を行うためにGR3ビットだけ左にシフトしておく必要があります。

dに関する解答群について

空欄dの次行から3ステップかけて、GR1GR2の入れ替え処理があります。58行目でGR1の符号部をRESULT領域に保存するということは、GR1GR2の絶対値の大きい方が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のようにGR0303Cがセットされました。

f:id:rahaema:20191208221619p:plain

#246C + #025D

+246+(-25)の計算ですが、GR0+221がセットされています。

f:id:rahaema:20191208221911p:plain

#206C + #027D(計算できないパターン)

GR02D9Cとなってパック10進数ではなくなっています。2段階の繰り下がり(用語が正しいのか分かりません)が考慮されていないのがバグの原因ですね。

f:id:rahaema:20191208222401p:plain

関連