ねえ、私はたくさんの質問をしていることを知っています..しかし、これに関するGoogleのリソースはあまりないので、これが将来同様のプロジェクトを試みようとする人々に役立つことを願っています.
アレックスが投稿したインテルのマニュアルを見ましたが、私にはかなり異質なようです 。 vol-2a-2b-instruction-set-az-manual.html
DIV
だから、単純なオペコードがどのように機能するかを知っていると思っていました。だってdivide
、やっぱり。を追加するのに何の問題もありませんでした。もちろん、ADD
皆さんが私を助けてくれたという問題がありました。難易度的には同じカテゴリーに入るようです。SUB
IMUL
DIV
IMUL
マニュアルを使用せずに、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コードを見て..おそらく両方を格納する必要EAX
がECX
あり、一時変数で除算が発生する前に..または剰余コードを最初に実行し、次に除算コードを実行します. 知らない。
たぶん、皆さんが私にもっと良い答えを提供してくれるかもしれませんが、おそらく1行で行うことはできませんが、いくつかの間違いを犯した可能性があります。ソフトウェアをコンパイルする前に修正する必要があります。