这个 x86 汇编指令是做什么的 (addsd xmm0, ds:__xmm@41f00000000000000000000000000000[edx*8])?

What does this x86 assembly instruction do (addsd xmm0, ds:__xmm@41f00000000000000000000000000000[edx*8])?

有人可以解释以下代码的作用吗?

addsd   xmm0, ds:__xmm@41f00000000000000000000000000000[edx*8]

我想一些值被添加到浮点寄存器xmm0,但是__xmm@41f000000000000000000000000000000 常量是什么意思?有没有我可以阅读的文档?

这是我试图理解的完整代码片段:

cvtsi2sd xmm0, [ebp+var_2C8]
mov     edx, [ebp+var_2C8]
shr     edx, 1Fh
addsd   xmm0, ds:__xmm@41f00000000000000000000000000000[edx*8]

ebp+var_2C8 是无符号整数值。

  1. ebp+var_2C8转换为float并移动到xmm0寄存器
  2. ebp+var_2C8移动到edx并右移31位
  3. xmm0 中添加了从该移位派生的内容。

xmm0 到底添加了什么? 此计算是否有可能的目的?

更新。
这是这段代码的原始反汇编:

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

看起来常量数组中的某些双精度值已添加到 xmm0...

这是无符号整数到双精度整数的转换。

它是如何工作的,它首先将它转换为有符号的,这意味着符号位的权重为 -231,但它应该是无符号的,因为最高位有一个+231的权重。因此,如果设置了符号,它会添加 +232 = 4294967296.0(41f0000000000000 作为双精度)进行补偿。它通过右移,将最高位放在最低位并清除其他所有内容来实现,然后将其用作 table 索引到包含 0 和 4294967296.0.

的 table 中。