2016-10-09 10 views
1

これは基本的な質問ですが、レジスタ$ t2、$ t3、$ t4に3つの数値を掛けたいとします。仮説的に言えば、各レジスタは8ビットしか保持できないと仮定し、3つの数値を掛け合わせると結果は8ビットより大きくなる可能性があります。それが8ビットより大きい場合、各レジスタが8ビットしか保持できない場合、結果はどのようにレジスタ$ t0に格納されますか?演算部はNohow overflow flagレジスタに格納される数値の大きさ

+1

あなたは*算術オーバーフロー*を発見しました。あなたの好きな検索エンジンにヒットしました。 –

+1

ここではさまざまなISAが異なるものを作っています。両方の半分(2つの出力)を得ているかもしれません。おそらく低い半分、多分何か他のもの。 – harold

+0

@harold私が触れたいことをありがとう。もし私が2つの出力を取得すると、1つの出力を1つのレジスタに格納し、もう1つの出力を別のレジスタに格納しますか?それは同時に行われますか? –

答えて

2

通常、CPUには2つのレジスタを逓倍し、複数のレジスタにまたがって2倍の結果を与える命令があります。これは、拡張精度演算を実装するために必要です。 2つの64ビット数を乗算し、128ビットを取得するためのAMD64上の例えば

は、あなたがどうなる結果:

mov rax, qword ptr [t2] 
mul qword ptr [t3] 
; the result is now in rdx : rax 
mov qword ptr [result], rax 
mov qword ptr [result + 8], rdx 

3の64ビット数をmultipliy、あなたが希望192ビットの結果を得るには上記のような関連する部分を乗算し、それらを合計することによって、拡張された精度の乗算を実装しなければならない。

+0

AMD64 ISAに精通していませんが、意味があります。では、結果はrdxとraxにどのように格納されていますか?あなたが自動的にアセンブラやコンパイラを推測してくれますか? –

+0

@deryl:いいえ、それは 'mul'命令の仕組みです。それは 'rax'の値を受け取り、それをオペランドで乗算し、その結果を' rdx:rax'ペアに格納します。また、x64という別名のamd64は、64ビットのIntelプロセッサーが動作するx86の64ビット拡張の一種です。 – ybungalobill

+0

クール!ありがとうございます –

0

。これはよく知られている算術オーバーフローです。

オペレータの順序を変更して、オーバーフローを回避することができます。 F.e.代わりにif (a + b > INT_MAX) ...と書くことができますif (a > INT_MAX - b) ...など。

時には、int64代わりのint32、またはdoubleの代わりfloatを使用する必要があります。

時には、GMPのような大きな数字のライブラリを使用する必要があります。

0

を設定するであろうと、特定の場合には