2010-11-18 21 views
1

私はMIPSを使用すると思うpcsimプログラムを使用しています。私はアセンブリ言語に非常に新しいので、私は肯定的ではありません。 2つの32ビットの数値にaddとshiftだけを掛けて、2つのレジスタに格納する必要があります。結果を32ビットで保存できる場合は、2つの数値を乗算することに成功しました。問題は、その数がそれよりも大きい場合、私は製品の右半分を左半分にどのように組み合わせるかを理解できないということです。左半分のレジスタは、2^32から始まる値をすべて保持する必要があります。これが明確でない場合、私はもっと説明しようとすることができます。私はこれを達成するために見落としているいくつかの簡単な方法はありますか?助けてくれてありがとう。2つの32ビットレジスタを64ビットの答えに統合するにはどうすればよいですか?

答えて

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)131を置き換えることができますビット数)

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ビットの追加が必要です)。

関連する問題