有人可以解释以下代码的作用吗?
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是无符号整数值。
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中。
最佳答案
这是无符号整数到double的转换。
它的工作方式是先将其转换为有符号,这意味着符号位的权重为-231,但是在最高位的权重为+231的情况下,它应为无符号的。因此,如果设置了符号,则会加上+232 = 4294967296.0(41f0000000000000为 double )进行补偿。它通过向右移动,将最高位放在最低位并清除所有其他内容来进行操作,然后将其用作包含0和4294967296.0的表的表索引。