2016-08-25 1 views
1

ARMプロセッサでは、たとえば、mul instructionがあり、これは32ビット×32ビットの乗算を実行し、結果の最下位32ビットを返します。彼らはまたumull and smull instructionsを持っていますが、32ビット×32ビットの乗算も行いますが、完全な64ビットの結果を返します。 umullは符号なし乗算を行い、smullは符号付き乗算を行います。符号なし乗算と符号付き乗算の両方で、最下位ビットの数はどれくらいですか?

mulの符号なしと署名付きの別のバージョンが必要ないのはなぜですか? 32ビット×32ビットの乗算の場合、おそらく結果の最下位32ビットは両方の場合で同じですか?ちょうど32ビットは同じか、32ビット以上ですか? mビットx nビットの乗算((m + n)ビットの結果を生成する)の場合、符号なし乗算と符号付き乗算の両方で最下位ビットの数がどれくらい同じであるか?

+0

最初に32ビットの2の補数で1 * 0xffffffffを計算してから、もう一度64ビットの2の補数で試してみてください; – Notlikethat

+0

は宿題に関する質問ですか? –

+0

@dwelch - いいえ、ちょうど好奇心。 – user200783

答えて

2

あなたは鉛筆と紙...小学校のスタイルでこれを行うことができます

-1 * = -3 3、UMULL対7 * 3 = 21 SMULL

0b111 * 0b011

111111 
* 000011 
========== 
    111111 
    111111 
000000 
... 
+ 
========== 
11111101 

(技術的徴候は以下のように広い内部ALUの入力として拡張される)

-3

同じ3ビット数を取るが、

0b111 * 0b011

 000111 
*  000011 
============= 
     000111 
    000111 
    000000 
+ ... 
============== 
    0010101 

をUMULL使用結果は21

で2の補数の美しさは、それを追加し、同じロジックを使用引くが、あなたは正しい答えを得るために伸びるためにサインをしなければならず、そこに擦り傷があります。符号なし符号はゼロを拡張します符号付き符号は符号を拡張します。 16ビット×16乗算を32ビットオペランドで実行する必要があるため、結果を格納するために必要なビット数が2倍になると乗算され、その上位16ビットには符号付き乗算と符号なしの間で変化します。一度署名したら、そこに違いがないので、同じ乗算ロジックを供給できることを確認してください。私は1つは、どのように追加と減算の仕事も、同じ加算器のロジックをフィードするとは、(借りてそれを呼び出すためにキャリービットを逆にする場合は)変更することがあります同様に引き分けに応じて異なりますが異なると主張することができると思います

は今、あなたの質問ごとに、はい、あなたは3ビットで3ビットを取る場合にのみ、ほとんど常に間違った答えである出力の下位3ビットを見て、とにかく同じ小学校の算数

AAAabc 
    DDDdef 
========= 
    AAAabc 
    AAAabc 
AAAabc 
AAAabc 
... 
=========== 

3x3ビット入力の下位3ビットは、オリジナルの3ビット入力によって厳密に決定されます。符号拡張は、umullとsmullの間で変化します。面白い演習ですが、現実世界の使用があまりにも多くないので、ほとんどのオペランドの組み合わせはオーバーフローしますが、高い割合ではありません。

この演習をM * Nビットについて繰り返す場合は、符号拡張の影響を受けないMビットまたはNビットのうちの小さいほうにする必要があります。その単純な運動は読者に委ねられている。

+0

'umull'と' smull'は同じ乗算を行いますが、唯一の違いはゼロ対サイン拡張ですか?その場合、mビット×nビットの乗算では、(m + n)ビットに拡張することは、少なくとも1つのオペランドの最下位の「最小(m、n)」ビットを除くすべてのビットに影響する。したがって、上位ビットが拡張のタイプの影響を受けるため、結果の最下位ビット(min(m、n))のみが符号なし乗算と符号付き乗算の両方で同一になります。 – user200783

+0

2つの変種は、2つのレジスタの値を掛け合わせ、第3および第4のレジスタに64ビットの結果を格納します。署名付き(SMULL)および署名なし(UMULL)バリアントがあります。ソース・オペランドの一方または両方が負の場合、符号付きバリアントは最上位32ビットで異なる結果を生成します。いくつかのアームの文書に書かれているように。 –

+0

残念ながら、その参照の疑似コードは違いを説明しませんでした、私は彼らは皆が知っていると推測しますね... –

関連する問題