ITブログアルケーナム管理人のニッシーです。アセンブリ言語CASL2での乗...2018-06-28アセンブリ言語CASL2での乗算のやり方COMET2は、教育用のコンピュータであるため、最低限のハードウェアでしか構成されていません。現在のコンピュータは、乗算回路が内臓されているため、ハードウェア的に高速処理で乗算を実現できますが、COMET2は乗算用の命令を持ち合わせていないため、ソフトウェア的に乗算を実現しなければならない、ということになります。今回は、CASL2による「乗算」の方法を紹介したていきます。ENDシミュレータにそのままコピー&ペーストで使えます。解説ループ処理を用いた乗算は、小学校で習う乗算を基本に組まれています。4は、5を4回加算することで実現しています。5したがって、CASL2でも5を4回加算し乗算を実現します。その際にループ処理を使って、5を加算する度に4から1を引き、4が0になった時点でループを抜ける、という処理によって4回のループを行います。掛ける数がループ回数ということになります。ループ回数それでは動作の流れをトレースで見てみたいと思います。0GR0の値が5になるためフラグレジスタに変化はありません。ためフラグレジスタに変化はありません。0ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し9行を処理します。0GR0の値が10になるためフラグレジスタに変化はありません。ためフラグレジスタに変化はありません。0ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し9行を処理します。0GR0の値が15になるためフラグレジスタに変化はありません。ためフラグレジスタに変化はありません。0ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し9行を処理します。0GR0の値が20になるためフラグレジスタに変化はありません。ためフラグレジスタが変化します。0ZFが1、SFが0のため、JPL命令で指定されたラベル「LP」に移動せず13行を処理します。RETRET命令で、「MUL」サブルーチンを抜けて、呼び出し元の「MAIN」サブルーチンに戻り処理が終了します。以上で処理が終了し、GR0が積です。20のため、正しい答えになっていることが分かります。ENDシミュレータにそのままコピー&ペーストで使えます。解説シフト演算を用いた乗算は、乗算の筆算による計算方法を基に組まれています。このシフト演算を用いた乗算は、例1のループ処理を用いた乗算よりも、行数が多いにも関わらず高速に動作します。計算対象の数値が100や1000と大きくなるほど、処理速度に差が出ます。ちなみに、このプログラムの原理は乗算回路にも使用されています。計算】まず、掛けられる数(5)と掛ける数(9)を2進数にして考える。2進数の掛ける数の各桁を見て1になっている桁位置に、掛けられる数を書き込む。書き込んだ掛けられる数の総和が答え。2進数の掛ける数の1になっている桁位置に、掛けるられる数を書き込む作業にシフト演算を用います。それでは動作の流れをトレースで見てみたいと思います。以下のデバッグも長いので興味がある方は見てみてください。0AND演算で、GR3の値が1になるためフラグレジスタに変化はありません。0ZFが0のため、JZE命令で指定されたラベル「ZERO」に移動せず13行を処理します。0GR0の値が5になるためフラグレジスタに変化はありません。0GR1の値が10になるためフラグレジスタに変化はありません。0GR1の値が4になるためフラグレジスタに変化はありません。ためフラグレジスタに変化はありません。0ZFが0のため、JNZ命令で指定されたラベル「LP」に移動し9行を処理します。0AND演算で、GR3の値が0になるためフラグレジスタが変化します。ためフラグレジスタに変化はありません。0ZFが1のため、JZE命令で指定されたラベル「ZERO」に移動し14行を処理します。0GR1の値が20になるためフラグレジスタが変化します。0GR2の値が2になるためフラグレジスタに変化はありません。ためフラグレジスタに変化はありません。0ZFが0のため、JNZ命令で指定されたラベル「LP」に移動し9行を処理します。0AND演算で、GR3の値が0になるためフラグレジスタが変化します。ためフラグレジスタに変化はありません。0ZFが1のため、JZE命令で指定されたラベル「ZERO」に移動し14行を処理します。0GR1の値が40になるためフラグレジスタが変化します。0GR2の値が1になるためフラグレジスタに変化はありません。ためフラグレジスタに変化はありません。0ZFが0のため、JNZ命令で指定されたラベル「LP」に移動し9行を処理します。0AND演算で、GR3の値が1になるためフラグレジスタに変化はありません。ためフラグレジスタに変化はありません。0ZFが0のため、JZE命令で指定されたラベル「ZERO」に移動せず13行を処理します。0GR0の値が45になるためフラグレジスタに変化はありません。0GR1の値が80になるためフラグレジスタに変化はありません。0GR2の値が0になるためフラグレジスタが変化します。ためフラグレジスタに変化はありません。0ZFが1のため、JNZ命令で指定されたラベル「LP」に移動せず18行を処理します。RETRET命令で、「MUL」サブルーチンを抜けて、呼び出し元の「MAIN」サブルーチンに戻り処理が終了します。以上で処理が終了し、GR0が積です。45のため、正しい答えになっていることが分かります。ENDシミュレータにそのままコピー&ペーストで使えます。再起処理を利用した乗算は、再起処理によって加算を繰り返すことで実現しています。例1のループ処理を用いた乗算と原理が似ており、ループ処理が再起処理に置き換わっただけのものになります。CASL2での再起処理のやり方すなわち、掛ける数が再起する数ということになります。再起の回数それではトレースで見てみたいと思います。ためフラグレジスタに変化はありません。0ZFが0のため、JZE命令で指定されたラベル「FIN」に移動せず11行を処理します。MULCALL命令で、「MUL」サブルーチンを呼び出し、再起処理により再び9行を処理します。ためフラグレジスタに変化はありません。0ZFが0のため、JZE命令で指定されたラベル「FIN」に移動せず11行を処理します。MULCALL命令で、「MUL」サブルーチンを呼び出し、再起処理により再び9行を処理します。ためフラグレジスタが変化します。0ZFが1のため、JZE命令で指定されたラベル「FIN」に移動し14行を処理します。RETRET命令で、「MUL」サブルーチンを抜けて、呼び出し元の「MUL」サブルーチンに戻り13行を処理します。0GR0の値が5になるためフラグレジスタが変化します。RETRET命令で、「MUL」サブルーチンを抜けて、呼び出し元の「MUL」サブルーチンに戻り13行を処理します。0GR0の値が10になるためフラグレジスタに変化はありません。RETRET命令で、「MUL」サブルーチンを抜けて、呼び出し元の「MAIN」サブルーチンに戻り処理を終了します。以上で処理が終了し、GR0が答えです。10のため、正しい答えになっていますね。最後に今回はCASL2で乗算を実現する方法について紹介いたしました。CASL2でも乗算用の命令が用意されていれば、苦労することはないのですが、教育用ですから仕方ありませんよね。乗算は、シフト演算と再起処理を利用したものが、少し理解し難いと思いますが、頑張って挑んでみてください。ITブログアルケーナム管理人のニッシーです。