繁体   English   中英

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

[英]What kind of C++ code would generate this x86 assembly instruction?

我一直在“逆向工程”我自己的一些库,以了解有关编译器优化的更多信息。 我已经看到我的一个最简单的类构造函数(一个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 ++代码会生成有问题的指令?

有问题的行是为正在构造的对象分配一个vtable指针。

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

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

不确定data_前缀的来源,但是? 是装饰( undname )名称的标准标记,您可以使用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'"

所以是的,它只是初始化vtable指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM