【发布时间】:2015-01-31 22:15:15
【问题描述】:
我一直在对自己的一些库进行“逆向工程”,以了解有关编译器优化的更多信息。我已经看到我最简单的类构造函数之一(一个 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 个字节转换为双精度字节也是如此。
我使用的编译器是带有 Visual Studio 2013 的 MSVC++,经过全面优化,没有任何高级指令集(SSE 等已关闭)。
哪些 C++ 代码会生成相关指令?
【问题讨论】:
-
最好在Reverse Engineering 提问,它只处理这类问题。
-
data??_7vector_t@data@@6B@我认为这是一个错误的名字。 -
@sashoalm 没有意识到有一个 SE 站点。谢谢。
标签: c++ assembly x86 reverse-engineering