私はMIPSを使用すると思うpcsimプログラムを使用しています。私はアセンブリ言語に非常に新しいので、私は肯定的ではありません。 2つの32ビットの数値にaddとshiftだけを掛けて、2つのレジスタに格納する必要があります。結果を32ビットで保存できる場合は、2つの数値を乗算することに成功しました。問題は、その数がそれよりも大きい場合、私は製品の右半分を左半分にどのように組み合わせるかを理解できないということです。左半分のレジスタは、2^32から始まる値をすべて保持する必要があります。これが明確でない場合、私はもっと説明しようとすることができます。私はこれを達成するために見落としているいくつかの簡単な方法はありますか?助けてくれてありがとう。2つの32ビットレジスタを64ビットの答えに統合するにはどうすればよいですか?
1
A
答えて
0
2つの半分を1つの32ビットレジスタに「結合」する方法はありません。 2つの半分をメモリ内の1つの64ビット値に結合する場合は、マシンのエンディアンに応じて、両方の半分を互いに保存する必要があります。 SPIMを使用している場合は、ホストコンピュータと同じeniannessを使用しているようです。
x86?スモールエンディアン。下半分を最初に保管してください。 PPC?ビッグエンディアン。上半分を最初に保管してください。
1
私が正しく理解していれば、実際に64ビット算術演算を行う必要があるのですか?
通常のシフト・アンド・加算バイナリ・ロング・マルチプレッションを実行している場合は、32ビット・オペレーションから64ビットのシフト・プリミティブとプリミティブをいくつか作成し、同じ方法を使用できます。
ここにいくつかのCフラグメントがあります(実際に使用している場合は、MIPSに変換するのは簡単です)。私は、あなたが符号なしの32ビット数を扱っており、符号なしの64ビットの結果を求めていると仮定しています。
論理シフトは、1ビットを左:
tmp = lo >> 31; /* top bit of lo to bottom bit of tmp, rest of tmp is 0 */
lo <<= 1;
hi <<= 1;
hi |= tmp;
論理右シフト1ビット:
tmp = hi << 31; /* bottom bit of hi to top bit of tmp, rest of tmp is 0 */
hi >>= 1;
lo >>= 1;
lo |= tmp;
(実際には、あなたが他のいくつかの数でシフトするn
と(32 - n)
で1
と31
を置き換えることができますビット数)
64ビット加算:
result_lo = a_lo + b_lo;
result_hi = a_hi + b_hi;
if (result_lo < a_lo)
result_hi++;
(詳細はMCPを参照してください。hereを参照してください)。
代わりのアプローチは、各32ビット入力を16ビットの「数字」のペアとして扱うことです。 2つの16ビット数を掛け合わせると、せいぜい32ビットの結果しか得られません。したがって、基本的な考え方は次のようになります。
0x12345678 * 0x23456789 = 0x5678 * 0x6789
+ ((0x1234 * 0x6789) << 16)
+ ((0x5678 * 0x2345) << 16)
+ ((0x1234 * 0x2345) << 32)
(まだ64ビットの追加が必要です)。
関連する問題
- 1. 2つの32ビットレジスタを1つの64ビットに移動するには?
- 2. 32ビットと64ビットのGMPライブラリの競合を解決するにはどうすればよいですか?
- 3. 32ビットのAmazon EC2 EBSバックアップインスタンスを64ビット版にアップグレードするにはどうすればよいですか?
- 4. 32ビットと64ビットLinux用のNPAPI Chromeプラグインをパッケージ化するにはどうすればよいですか?
- 5. 64ビットRHEL6でlibpam.so.0(32ビット)を取得するにはどうすればよいですか?
- 6. 64ビット環境で32ビット.NETアプリケーションを実行するにはどうすればよいですか?
- 7. 64〜32ビットInterop - どのように?
- 8. 32ビットマシンから64ビットのターゲットにパブリッシュするにはどうすればよいですか?
- 9. 64ビットの数値をVBScriptの上位32ビットと下位32ビットに分割するにはどうすればよいですか?
- 10. 32ビットウィンドウ下の64ビットレジスタ
- 11. 64ビットプラットフォーム用の32ビットApacheモジュールをコンパイルするにはどうすればよいですか?
- 12. XMM 128ビットレジスタを2つの64ビット整数レジスタに分割する方法は?
- 13. 2つの32ビット整数を64ビット整数に結合するのはなぜですか?
- 14. 2つの32ビット整数を乗算して64ビット整数を生成するにはどうすればよいですか?
- 15. 32ビットSSISパッケージを64ビットマシンで単体テストするにはどうすればよいですか?
- 16. Mac OSで32ビットpyqをインストールするにはどうすればいいですか?Python 3.6-32の場合
- 17. CentOS 64にインストールされた32ビットgdbを呼び出すにはどうすればいいですか?
- 18. Tomcatがウィンドウサーバー上で32ビットまたは64ビットであるかどうかを調べるにはどうすればよいですか?
- 19. インストーラが標準DSNを作成しない場合、64ビットServer 2008で32ビットODBCドライバを使用するにはどうすればよいですか?
- 20. 32ビットと64ビットマシンの両方で常に64ビットです
- 21. 32ビットまたは64ビットプロセスから実行する場合でも、64ビットPowerShellプロセスをどのように起動するのですか?
- 22. 32ビットレジスタペアに格納されている64ビット整数をどのように否定するのですか?
- 23. これは32ビットまたは64ビットのJVMですか?
- 24. 64ビットアプリケーションの32ビット部分をどのようにデバッグ(GDB)できますか?
- 25. 32ビットのMySQLを64ビットのMS Accessにリンクするには?
- 26. Xcode 4に32ビットと64ビットの両方で動作するFoundationコマンドラインツールを構築するにはどうすればよいですか?
- 27. 64ビットのDLLを32ビットのJVMにロードできますか?
- 28. ロングモードで64/32ビットレジスタを使用する場合、罰則がありますか?
- 29. Windows上でGIT 32ビットを64ビットにアップグレードするには?
- 30. CUDAデバイスが32ビットまたは64ビットのアドレッシングをサポートするかどうかの問い合わせ