0

ねえ、私はたくさんの質問をしていることを知っています..しかし、これに関するGoogleのリソースはあまりないので、これが将来同様のプロジェクトを試みようとする人々に役立つことを願っています.

アレックスが投稿したインテルのマニュアルを見ましたが、私にはかなり異質なようです 。 vol-2a-2b-instruction-set-az-manual.html

DIVだから、単純なオペコードがどのように機能するかを知っていると思っていました。だってdivide、やっぱり。を追加するのに何の問題もありませんでした。もちろん、ADD皆さんが私を助けてくれたという問題がありました。難易度的には同じカテゴリーに入るようです。SUBIMULDIVIMUL

マニュアルを使用せずに、OllyDbg で自己デバッグ テストを行うだけです。

除算の答えは常に に格納されていることがわかりましたEAX。計算された残りは、誰が知っていたのか、に保管されていEDXます。

このアルゴリズムを研究することは非常に重要であり、誰かが乱数除算の残りを使用して 0 から 10 の非常に巧妙なスイッチを生成することを知っていました..しかし、それでも私の質問です。

16 進数を割ると余りがあり、小数点がそれらに属さないとは考えたこともなかったのは、すでに奇妙です。

DIV ECX

のようになります

regs.d.eax /= regs.d.ecx;
regs.d.edx = regs.d.eax % regs.d.ecx;

私は最初に残りを得るかもしれないと思っていました..簡単なことです。

regs.d.edx = regs.d.eax % regs.d.ecx;
regs.d.eax /= regs.d.ecx;

わかりました、私は数学的プログラミングをほとんど扱っていないので、少し混乱しています。私は、結果を文字列に保存してから小数点で分割する方が多く、それが残りを取得する方法です。そうです、遅いことはわかっていますが、簡単な道を進んでいます..数学コードの演算。

わかりました..私がそこに置いたCコードを見て..おそらく両方を格納する必要EAXECXあり、一時変数で除算が発生する前に..または剰余コードを最初に実行し、次に除算コードを実行します. 知らない。

たぶん、皆さんが私にもっと良い答えを提供してくれるかもしれませんが、おそらく1行で行うことはできませんが、いくつかの間違いを犯した可能性があります。ソフトウェアをコンパイルする前に修正する必要があります。

4

2 に答える 2

2

マニュアルは読みやすいものではありませんが、あなたの質問に対するすべての答えがあります(まあ、それらのほとんどは、ドキュメントに時折省略や間違いがあります)。

推測されたアルゴリズムに欠けていることの1つは、DIVが通常2NビットをNビットでDIV ECX除算することです。つまり、EDX:EAXに含まれる64ビットの符号なし値をECXの32ビットの符号なし値で除算します。その後、商はEAXに保存され、残りはEDXに保存されます。

また、除算オーバーフローの可能性(この場合はEDX> = ECXがその条件です)と、命令がEFLAGSレジスタで変更するフラグについても覚えておく必要があります。

于 2011-10-14T10:25:02.477 に答える
0

合理的に公平な翻訳は次のようになると思います。

  int16_t a=42,b=7;
  int16_t div = a/7;
  int16_t remainder = a - (div*b);

実際には、これは同等である場合と同等でない場合がありremainder = a % bます(標準仕様を調べる必要があります)。負の数で何が起こるかを注意深く考えると、さらに興味深いものになります。

そうは言っても、小数点は決して機能しないので、投稿でそれについて言及する理由がわかりません。

おそらくそれは一行で行うことはできません[...]

コンパイラが部分式の再利用を認識し、適用可能な場合は (E)DX の残りを自動的に使用するのではないかと私は強く思っています。(これはコンパイラにとっては些細な最適化です)

于 2011-10-14T10:18:34.820 に答える