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

8

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

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转换为浮点数并移动到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...


3
这是一个查找表或数组。 "silly constant" 只是你的反汇编器(也可能是一个符号)的产物,请查看原始反汇编以查看实际地址。 - Jester
1个回答

14

这是将无符号整数转换为双精度浮点数。

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


无法感谢你提供这么详尽的解释! - leo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接