这个x86汇编指令做了什么(添加了xmm0,ds:__ xmm @ 41f00000000000000000000000000000 [edx * 8])?

时间:2015-12-16 19:53:22

标签: assembly x86 sse

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

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

我认为某些值被添加到浮点寄存器xmm0,但是__xmm @ 41f00000000000000000000000000000常量是什么意思?有没有我可以阅读的文件?

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

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。
  4. xmm0究竟添加了什么? 这个计算有可能吗?

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

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

    看起来像常量数组中的一些double值被添加到xmm0 ...

1 个答案:

答案 0 :(得分:12)

这是无符号整数转换为double。

它的工作原理是它首先将其转换为有符号,这意味着符号位的权重为-2 31 ,但它应该是无符号的,其中顶部位的权重为+2 < SUP> 31 。因此,如果设置了符号,则将+2 32 = 4294967296.0(41f0000000000000为double)加以补偿。它通过向右移动,将最高位置于最低位并清除其他所有内容,然后将其用作包含0和4294967296.0的表的表索引来实现。