- ベストアンサー
16ビットCPUで32ビットの計算方法
16ビットのCPUを持つシーケンサ(PLC )で32ビットの四則演算(加算、減算、乗算、除算)をさせたいのですが、命令語にダブルワードを処理できるものがないので、演算がオーバーフローした情報から何かしら自分でプログラムを組まなければなりません。 16ビットのレジスタを使った32ビット演算の考え方を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
普通は、ダブルワードなんて有りません。 そのCPUのアセンブリ言語での16bitの和、差の演算で、キャリー、ボローは出ませんか? そうであれば、まず、32bitの数値を上位16bitと下位16bitに分けます。で、自分が、紙に書いて演算するように、演算するようにプログラムを組みます。 たとえば、あなたは、足し算、引き算をするときにどうしていますか? 下位の桁から1桁ずつ計算していませんか? 和であれば、下位同士を足します。そのときに繰り上がりがあったら上位同士を足す時に繰り上がりも足しますよね? (でも、ふつうのCPUなら、キャリーフラグも足す足し算命令があるハズなんですけどねぇ。) 自分が紙に数値を書いて演算する様に、計算をプログラムして下さい。 ただ、その数字の扱いが10進数ヒトケタではなく、16bitでまとめて考えるだけです。 引き算も一緒ね。本当は、引き算は、反転して一を引いた数(補数)にして、足し算にしちゃうんだけど、それは理解できるようなら、やってください。 かけ算は、スピードを考えないので有れば、その回数だけ足し算を繰り返します。ホントは、bit演算と、シフトと足し算なんですけど、まぁ、単純に足し算で良いでしょう。 わり算は、引き算の回数を数えましょう。そのときに、これもシフトを上手く使えば速度を稼げます。 ということで、自分で紙に書いて、実際に演算をしてから、プログラムを作成してください。 あえて、これ以上は教えません。 #実は私はプログラマさんじゃない(^^;)んで、これ以上は無理です。
その他の回答 (3)
- ymmasayan
- ベストアンサー率30% (2593/8599)
No.1、No.2のymmasayanです。 キャリーやボローが簡単に扱えるのならNo.3の方の言われる方法がいいですね。 何分私の扱っていた大昔のマシンはキャリーやボローはオーバーフロー割り込みで OSに飛んで行ってしまってましたので・・・。(^^; それではがんばってください。
- ymmasayan
- ベストアンサー率30% (2593/8599)
No.1です。補足質問に回答します。 「多倍長演算」というキーワードで沢山ヒットします。 ただ浮動小数点関係のものが多いですが。 大きな数を10進のN桁に分解して演算する例がありました。 アドレスのコピペができないのでGoogleで「多倍長演算 プロ言」で検索ください。 私の言ったのはこれに似ていますが、256進に分解してスピードをあげて 実行しようと言うものです。 IPアドレスの8桁区切りと似ています。 例)C1.C2.C3.C4=A1.A2.A3.A4+B1.B2.B3.B4 1)A4+B4を計算しC4に入れる。 2)C4が256以上なら256を引いてA3に1を足す。 3)以下同様に繰り返し。
お礼
どうも、ありがとうございました。 とても参考になりました。
- ymmasayan
- ベストアンサー率30% (2593/8599)
ほかに方法があるかも知れませんが。 オーバフローを使うのは大変だと思うので8ビットずつ区切って、 4ワードで計算したらどうでしょう。 私ならそうします。 ただ、割り算だけは結構面倒ですね。
補足
レスありがとうございます。 具体的に言うとどんな感じにすればいいのでしょうか? よろしければ、参考になるようなサイトとかありませんか?
お礼
どうも、ありがとうございました。 とても参考になりました。