什么样的C++代码会生成这个x86汇编指令?

3

我一直在“逆向工程”自己的一些库,以了解更多有关编译器优化的知识。 我发现我的最简单的类构造函数(一个4-D向量)被编译成以下内容:

fldz                                                        ; push +0.0 to FPU stack
mov     eax, ecx                                            ; set eax to this (ecx)
mov     dword ptr [eax], offset data_??_7vector_t@data@@6B@ ; what is this doing?
fst     dword ptr [eax+4]                                   ; assign this->first
fst     dword ptr [eax+8]                                   ; assign this->second
fst     dword ptr [eax+0Ch]                                 ; assign this->third
fstp    dword ptr [eax+10h]                                 ; assign this->fourth, pop FPU stack
retn                                                        ; return this (eax)

在第三行,我不知道这是在做什么。我最初认为这可能是一种引用某个硬编码的常量数据块的优化方式。为了确定它可能是什么,我将DLL加载到一个容器进程中,然后附加调试器并查看位于data??_7vector_t@data@@6B@位置的数据,但只是db offset unk??_7vector_t@data2@@6B@。我跟随了第二个标签,发现有一段数据区域,即使将前8个字节转换为double后,也没有对应于我在项目中识别出来的任何东西。我使用的编译器是带有Visual Studio 2013的MSVC++,没有使用任何先进的指令集(SSE等已关闭)。哪些C++代码会产生这个问题?

5
建议您在[reverseengineering.se]上提出此类问题,该网站专门涉及此类问题。 - sashoalm
1
data??_7vector_t@data@@6B@ 我认为这是一个符号重整的名称。 - ikh
@sashoalm 没有意识到有一个专门的SE网站。谢谢。 - Michael J. Gray
3个回答

1

不确定data_前缀来自哪里,但是?是装饰(编译)名称的标准标记,您可以使用undname工具解密它们:

>undname ??_7vector_t@data@@6B@
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "??_7vector_t@data@@6B@"
is :- "const data::vector_t::`vftable'"

所以,是在初始化虚函数表指针。

啊,我不知道微软有这样的工具。我一直在使用另一个程序中的工具,只能解开导出函数名称的混淆。谢谢你提供的额外信息! - Michael J. Gray

1
这行代码将一个vtable指针赋值给正在构建的对象。

1

在我看来,它正在将构造函数应用于ECX处未初始化的存储。

这些步骤将在其第一个插槽中插入vtable指针,并将您所说的应用程序使用的4d向量清零。


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