2015-12-16 15 views
5

誰かが次のコードの機能を説明できますか?このx86アセンブリ命令は何ですか(addsd xmm0、ds:__ xmm @ 41f000000000000000000000000000 [edx * 8])?

addsd xmm0, ds:[email protected][edx*8] 

は、私はいくつかの値がXMM0登録float型に追加されていることを考え出したが、41f00000000000000000000000000000定数@ __xmmの意味は何ですか?私がそれについて読むことができる文書はありますか?

は、ここで私は理解しようとしているコードの完全なフラグメントです:

cvtsi2sd xmm0, [ebp+var_2C8] 
mov  edx, [ebp+var_2C8] 
shr  edx, 1Fh 
addsd xmm0, ds:[email protected][edx*8] 

EBP + var_2C8は、符号なし整数値です。

  1. EBP + var_2C8はfloatに変換され、
  2. EBPレジスタXMM0に移動+ var_2C8は、このシフトに由来するものがXMM0に追加される31ビット
  3. だけシフトEDX及び右に移動されます。

xmm0には正確に何が追加されていますか? この計算には何らかの目的がありますか?
ここでは、このコードのための生分解です:定数の配列からいくつかのdouble値をXMM0に追加されるように

cvtsi2sd xmm0,dword ptr [ebp-2C8h] 
mov   edx,dword ptr [ebp-2C8h] 
shr   edx,1Fh 
addsd  xmm0,mmword ptr [edx*8+2685CC0h] 

が見える...

+2

ルックアップテーブルまたは配列です。愚かな定数はあなたの逆アセンブラの単なる製品であり(記号でもあり得る)、生分解を見て実際のアドレスを見る。 – Jester

答えて

9

これは倍増する符号なし整数の変換です。仕組み

は、それが最初の符号ビットの-2 量を有するが、先頭のビットが+2 の重量を有する場合、それが署名しなければならないことを意味し、署名されたとして、それを変換します。したがって、符号が設定されている場合は、+2 = 4294967296.0(倍精度は41f0000000000000)が加算されます。それは右にシフトすることによって、最下位ビットを最下位ビットに置き、それ以外のものをすべてクリアし、それを0と4294967296.0を含むテーブルへのテーブルインデックスとして使用します。

+0

この完全な説明には十分にありがとうございます! – leo

関連する問題