我在Visual Studio 2008中由MSVC编译器生成的代码中找到了这一行,同时试图找出似乎是编译器错误的内容:
movss dword ptr [this], xmm2
虽然我不认为这与我正在寻找的错误有关,但我是什么样的哔哔声?在this
中存储浮动值(与[this]
btw完全无关)?
这条线到底是做什么的?因为我肯定无法理解它!或者反汇编视图在我身上耍花招?
答案 0 :(得分:4)
提供更多的汇编和/或源代码确实会有所帮助,但我发现至少有两种可能性:
this
不是这个指针,只是一个指向某个内存区域的随机寄存器。反汇编程序将其命名为,因为它之前在函数中用作此指针或出于其他原因。
this
指向一个类实例,该类有一个浮点字段作为第一个成员,没有虚拟方法。
答案 1 :(得分:3)
xmm寄存器不一定包含浮点值。它们是128位宽的SIMD寄存器,基本上意味着一个或多个值可以存储在SIMD寄存器内;通常配置是8个16位整数,4个32位,4个浮点数,2个双精度;等。
然而,编译器可以自由地放置任何它喜欢的内容,只要'this'的第一个元素是32位就可以了。
答案 2 :(得分:3)
根据Intel manual on x86 instructions,MOVSS复制XMM寄存器的最低32位。 (每个XMM寄存器的长度为128位。)
虽然该指令被称为“移动标量单精度浮点值”,但您应该将其视为“移动32位值”。该指令不关心数据是否实际上是浮点数;它只是复制没有解释的位。
在您的情况下,指令将XMM2的最低32位复制到this
指向的存储单元。我想这是因为你的编译器使用XMM2作为存储寄存器(而不是使用像EAX这样的通用寄存器)。