这个 x86 汇编指令是做什么的 (addsd xmm0, ds:__xmm@41f00000000000000000000000000000[edx*8])?
What does this x86 assembly instruction do (addsd xmm0, ds:__xmm@41f00000000000000000000000000000[edx*8])?
有人可以解释以下代码的作用吗?
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 是无符号整数值。
- 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...
这是无符号整数到双精度整数的转换。
它是如何工作的,它首先将它转换为有符号的,这意味着符号位的权重为 -231,但它应该是无符号的,因为最高位有一个+231的权重。因此,如果设置了符号,它会添加 +232 = 4294967296.0(41f0000000000000 作为双精度)进行补偿。它通过右移,将最高位放在最低位并清除其他所有内容来实现,然后将其用作 table 索引到包含 0 和 4294967296.0.
的 table 中。
有人可以解释以下代码的作用吗?
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 是无符号整数值。
- 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...
这是无符号整数到双精度整数的转换。
它是如何工作的,它首先将它转换为有符号的,这意味着符号位的权重为 -231,但它应该是无符号的,因为最高位有一个+231的权重。因此,如果设置了符号,它会添加 +232 = 4294967296.0(41f0000000000000 作为双精度)进行补偿。它通过右移,将最高位放在最低位并清除其他所有内容来实现,然后将其用作 table 索引到包含 0 和 4294967296.0.
的 table 中。