これは基本的な質問ですが、レジスタ$ t2、$ t3、$ t4に3つの数値を掛けたいとします。仮説的に言えば、各レジスタは8ビットしか保持できないと仮定し、3つの数値を掛け合わせると結果は8ビットより大きくなる可能性があります。それが8ビットより大きい場合、各レジスタが8ビットしか保持できない場合、結果はどのようにレジスタ$ t0に格納されますか?演算部はNohow overflow flagレジスタに格納される数値の大きさ
答えて
通常、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ビットの結果を得るには上記のような関連する部分を乗算し、それらを合計することによって、拡張された精度の乗算を実装しなければならない。
AMD64 ISAに精通していませんが、意味があります。では、結果はrdxとraxにどのように格納されていますか?あなたが自動的にアセンブラやコンパイラを推測してくれますか? –
@deryl:いいえ、それは 'mul'命令の仕組みです。それは 'rax'の値を受け取り、それをオペランドで乗算し、その結果を' rdx:rax'ペアに格納します。また、x64という別名のamd64は、64ビットのIntelプロセッサーが動作するx86の64ビット拡張の一種です。 – ybungalobill
クール!ありがとうございます –
。これはよく知られている算術オーバーフローです。
オペレータの順序を変更して、オーバーフローを回避することができます。 F.e.代わりにif (a + b > INT_MAX) ...
と書くことができますif (a > INT_MAX - b) ...
など。
時には、int64
代わりのint32
、またはdouble
の代わりfloat
を使用する必要があります。
時には、GMPのような大きな数字のライブラリを使用する必要があります。
を設定するであろうと、特定の場合には
あなたは*算術オーバーフロー*を発見しました。あなたの好きな検索エンジンにヒットしました。 –
ここではさまざまなISAが異なるものを作っています。両方の半分(2つの出力)を得ているかもしれません。おそらく低い半分、多分何か他のもの。 – harold
@harold私が触れたいことをありがとう。もし私が2つの出力を取得すると、1つの出力を1つのレジスタに格納し、もう1つの出力を別のレジスタに格納しますか?それは同時に行われますか? –