使用movss指令将[this]作为目标的目的是什么?

4

我在尝试查找一个编译器错误时,在Visual Studio 2008生成的代码中发现了这一行:

movss dword ptr [this], xmm2

尽管我认为这与我正在寻找的错误无关,但我感到十分困惑。将一个浮点值(完全与this无关)存储在[this]中?那行代码到底是做什么的?因为我真的看不懂!还是反汇编视图在玩弄我?

这真的是反汇编,还是包含内联汇编的源代码?我问这个问题是因为this是C++关键字,在汇编中没有意义。this指针通常存储在ecx中。另一方面,x64编译器不支持内联汇编。 - Ben Voigt
这是MSVC调试器反汇编视图中显示的内容。[this]是我正在查看的函数的第一个输入参数的符号(我有调试符号)。 - thehan
但是也许调试器显示有误。无论如何,这不是内联汇编。该代码已针对x64进行编译,因此不允许这样做。 - thehan
3个回答

4
提供更多的汇编和/或源代码将会非常有帮助,但我看到至少有两种可能性:
  1. this 不是一个指向当前对象的指针,而只是一个指向某个内存区域的随机寄存器。反汇编器之所以这样命名,是因为它先前在函数中被用作当前对象指针或出于其他原因。

  2. this 确实指向一个类实例,并且该类具有浮点数字段作为第一个成员并且没有虚方法。


嗯,我认为在第一种情况下伊戈尔是正确的...我的真正的“this”指针指向0x0000000031593FC0,而反汇编器[this]指向0x00000000becccccd。现在要弄清楚那代表什么... - thehan
@thehan 为什么不多发布一些代码?是因为有些超级机密的东西吗? - Igor Skochinsky

3

xmm寄存器不一定包含浮点值。它们是128位宽的SIMD寄存器,这意味着一个或多个值可以存储在SIMD寄存器中;通常的配置是8个16位整数、4个32位整数、4个浮点数、2个双精度浮点数等。

然而,编译器可以自由地将任何东西放在其中,只要“this”的第一个元素是32位即可。


但就我所见,这行代码基本上会覆盖'this'的虚函数表,因为它是在该地址上首先发生的。而且我知道xmm2包含一个不应该写入那里的浮点值... 嗯... 编辑:xmm2之前加载了一个成员变量,它是一个浮点数,并且自从那时以来其值没有改变过。 - thehan
如果'this'指的是C++中的同一个'this',它不会覆盖虚函数表(vtable);它将覆盖写入对象的前4个字节,因为这就是movss的作用。 - Jasper Bekkers

3
根据Intel x86指令手册,MOVSS复制XMM寄存器的最低32位。(每个XMM寄存器长度为128位。)
虽然该指令称为“移动标量单精度浮点值”,但实际上应将其视为“移动32位值”。该指令不关心数据是否实际上是浮点数;它只是复制位而没有解释。
在您的情况下,该指令将XMM2的最低32位复制到this指向的内存位置。我认为这是因为编译器正在使用XMM2作为存储寄存器(而不是使用通用寄存器如EAX)。

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