有人可以解释以下代码的作用吗?
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是无符号整数值。
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 ...
答案 0 :(得分:12)
这是无符号整数转换为double。
它的工作原理是它首先将其转换为有符号,这意味着符号位的权重为-2 31 ,但它应该是无符号的,其中顶部位的权重为+2 < SUP> 31 。因此,如果设置了符号,则将+2 32 = 4294967296.0(41f0000000000000为double)加以补偿。它通过向右移动,将最高位置于最低位并清除其他所有内容,然后将其用作包含0和4294967296.0的表的表索引来实现。