平成21年度春季 基本情報技術者試験(FE)の午後問題12(アセンブラ言語CASL)は、
- 32ビットの乗算
に関する問題でした。
設問1
空欄a
ポイントは、SRL命令を実行したとき、
- OFにはレジスタから最後に送り出されたビットの値が設定される
- ZFが1のときは、ラベルFINの処理を行う
ということでしょうか。OFが1のときは、乗数の一番右側のビットが1ということなので、加算処理を行うことになります。
空欄b
空欄bの前行で、下位16ビットの加算処理が行われています。このとき、オーバフローが発生した場合には、上位16ビットに対してけた上げの処理が必要となります(ラベルADJ1の処理)。
空欄c
被乗数(32ビット)の下位16ビットを1ビット左にシフトします。このときオーバフローが発生した場合は、被乗数(32ビット)の上位16ビットに対してけた上げ処理を行います(ラベルADJ2の処理)。
実行結果
作成したプログラムを「CASLシミュレータ(CASL II 対応)」で実行してみました。被乗数#12345678に対して、乗数2で計算してみた結果が以下です。アドレス#000B,#000C番地に2倍した値が格納されています。
設問2
空欄d
空欄dの前行で、GR2に被乗数の上位16ビットが格納されているメモリのアドレスが格納されましたので、被乗数x乗数上位語の計算に向けて、GR2に乗数上位語を設定します。空欄dの次の行は、このままCALL MULSを呼び出してしまうと、せっかく計算した積(A)の結果が上書きされて無くなってしまうことを防ぐための処理です。
空欄e
空欄eの後の行では、GR6に対する加算処理に向けて準備をするのですが、積(B)の結果がラベルSVに格納されていますので、GR3を使って積(B)の下位16ビットをGR6にLDします。
実行結果
検算がしやすいように、被乗数を#12345678、乗数を#00010001として実行してみました。本来なら、#123468AC5678ですが、下位32ビットはちゃんと計算できていることがわかります。