3

8086アセンブリまたは同様の方法で、符号なし整数を3で除算したいので、DIVオペコードを使用したくない高速化を実現します。

4

2 に答える 2

4

Hacker's Delight の該当する第 10 章「定数による整数除算」を読んでください。ボーナス コンテンツはそのチャプターで利用できます (チャプター自体ではありません)。

または、最初のステップで既知のアルゴリズムを適用して適切な定数を見つけるライブラリであるlibdivideを使用して、指定された分母による除算を高速化します。

libdivide ページで指摘されているように、コンパイラはコンパイル時の定数による除算を乗算とシフトに変換する方法を知っているため、最も簡単な方法はコンパイラを使用することです。私はあなたのためにそれを行いますが、私は 16 ビット コンパイラを持っていません。32 ビット コンパイラで実行すると、結果は次のようになります。

    movw    $-21845, %ax
    mulw    8(%ebp)
    andl    $65534, %edx
    movl    %edx, %eax
    shrl    %eax

C 関数の場合:

int f(unsigned short d)
{
  return d / 3;
}
于 2013-02-23T11:18:00.973 に答える
3

本質的な答えは、「希望の定数の逆数で乗算する」ことです。シフトと加算を使用して乗算を実行し、次にいくつかの可能なポストシフトを使用して2進小数点を適切に配置します。

秘訣は、予想される最大の入力配当のサイズを処理するために、逆数の精度がどうあるべきかを理解することです。最大の入力オペランドはレジスタ全体であると判断できることは明らかですが、詳細がわかっている場合は、ビット数の少ない逆数を使用すると、シフト加算スタイルの乗算が高速になります。

Cuoqの回答は、優れた参考資料を提供します。

于 2013-02-23T11:29:55.037 に答える