ハードウェア除算器が処理できるよりも大きな除数を処理できる拡張精度除算ルーチンは、想像以上に複雑です。以前、128 個の値を 64 ビット値で除算する関数を書かなければならなかったことがありますが、かなり面倒でした (そして、一般的に遅い)。
Randall Hyde が彼の「Art of Assembly Language」テキスト (Volume 4、Section 4.2.5 - Extended Precision Division) で説明しているアルゴリズムを見てください。
ここに抜粋があります:
DIV 命令および IDIV 命令を使用して、一般的な n ビット / m ビットの除算演算を合成することはできません。このような演算は、一連のシフト命令と減算命令を使用して実行する必要があり、非常に面倒です。ただし、n ビット量を 32 ビット量で除算する一般的ではない操作は、DIV 命令を使用して簡単に合成できます。このセクションでは、拡張精度除算の両方の方法を示します。
多倍精度除算演算の実行方法を説明する前に、一部の演算では、単一の DIV または IDIV 命令で計算できるように見えても、拡張精度除算が必要になることに注意してください。結果の商が 32 ビットに収まる限り、64 ビット量を 32 ビット量で割るのは簡単です。DIV および IDIV 命令は、これを直接処理します。ただし、商が 32 ビットに収まらない場合は、この問題を拡張精度除算として処理する必要があります。ここでの秘訣は、被除数の (ゼロまたは符号拡張された) HO dword を除数で割り、剰余と被除数の LO dword を使用してプロセスを繰り返すことです。
したがって、除数に 64 ビットの量を本当に使用する必要があるかどうかを判断することをお勧めします。そうでない場合は、そのタスクを実行する関数を簡単に作成できます。64 ビット値を 64 ビット値で本当に除算する必要がある場合でも、それを行うことができますが、それはより難しい問題です。より具体的には、おそらくコンパイラが「インライン化」するのに適したものではないため、ライブラリルーチンです。
ああ、忘れないでください - MS はライブラリのソース コードを提供しています。 __alldiv()
のアセンブリ言語関数ですlldiv.asm
。そのファイルをプロジェクトに追加するだけで、残りのライブラリなしでリンクするのはそれほど難しくありません。