有人可以解释以下代码的作用吗?
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是无符号整数值.
ebp + var_2C8转换为float并移动到xmm0寄存器
ebp + var_2C8移动到edx并右移31位
从此移位得到的东西被添加到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 ...
这是无符号整数转换为double.
工作原理是它首先将其转换为带符号,这意味着符号位的权重为-2 31,但它应该是无符号的,其中最高位的权重为+2 31.因此,如果设置了符号,则将+2 32 = 4294967296.0(41f0000000000000为双倍)加以补偿.它通过向右移动,将最高位置于底部位并清除其他所有内容,然后将其用作包含0和4294967296.0的表的表索引来实现.