0

アセンブリ言語で効率的な拡張乗算を作成しようとしています。私のコードはうまく動作しますが、符号付き乗算に問題があります。現在、私の数は 2 の補数法に基づいています。私は自分の数を正数に変換して乗算し、最終的なサイズを調整します。動作しますが、追加のコピーが必要なため、少しダミーです。ハードウェアの本を開いたところ、符号付きの数値に対して適切に動作するシフト加算乗数を発見しました。

したがって、入力用に 4 ビットの数値で作業していることを考えると、出力用に 8 ビットが得られます。左シフトバイナリ乗数を使用して、乗算を-3 * 3にしたいのですが、次のようになります。

                     1101  // -3
               X     0011  // 3 
         -----------------------
         11111101 // I make the first x with sign extension
         1111101 // I make the a second x with sign extension,
         000000  // 0 no sign extension
         00000   // Later I will subtract this in case "of", as in book
         -----------------------
         11110111 <----------- final addition I get -9 OK it works

それでは、教科書のアルゴを使用したハイブリッド ソリューションに進みましょう。最初の数値 1101 を 11 と 01 に分解し、0011 も同様に 00 と 11 に分解します。アルゴを書き直すと、学校で学んだように、次のようになります。

           11 01
           00 11
           ---------------
           00 11  (unsigned mul 01 x 11 gives 00 11) , no sign extension
        10 01     (11 * 11  gives 10 01)                             
        --------------------
        10 01 11 (sum)
     11 10 01 11 (I made a sign extension until 8 bit)
     00 00 00 00 (the last multiplication only 0)
     -----------------------       
     11 10 01 11 (final sum) 

結論 11110111 != 11100111、ちょっと損した。

さて、pbはどこですか?

一番。

4

1 に答える 1

1

あなたは奇妙なことをしている。

符号付き整数を乗算するには、いくつかの一般的な方法があります。

  1. あなたが説明したように、最初に2つの被乗数の絶対値を掛けてから、積が負であると予想される場合はそれを否定することができます.

  2. 符号なし乗算を使用して整数を乗算し、一方の被乗数が負の場合は、積の最上位半分からもう一方を減算します (次に、同じことを対称的に繰り返し、他の被乗数が 0 未満かどうかをチェックします)。

  3. ブースのアルゴリズムを使用します。

于 2013-02-19T00:30:45.233 に答える