什么样的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 个字节转换为双精度之后也是如此。
我使用的编译器是带有Visual Studio 2013的MSVC++,具有完全优化,没有任何高级指令集(SSE等已关闭)。
什么C++代码会生成有问题的指令?
不确定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'"
所以是的,它只是初始化 vtable 指针。
有问题的行是将 vtable 指针分配给正在构造的对象。
在我看来
,它正在将构造函数应用于 ECX 的未初始化存储。
该步骤将在其第一个插槽中插入一个 vtable 指针,并将您所说的应用程序使用的 4d 向量归零。
相关文章:
- 为x86而非x64编译时出错
- C++如何仅使用MOV在x86上实现发布和获取
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 在 c++ 中使用 x86 DIV 的这个 asm 块有什么用?
- 为什么 memcpy() 和其他类似的函数使用汇编?
- 在 x86 上实现 std::atomic_thread_fence(std::memory_order_seq_cst
- 这个x86汇编代码是如何接收和存储子程序返回的数据的
- 卤化物:X86汇编代码生成
- 如何在 x86 汇编中调用函数并将参数传递给它
- x86 汇编和优化代码中的 for 循环
- 斐波那契汇编x86的一个变体,不得不从c ++主方法调用它,有点丢失在几个部分
- 什么样的C++代码将生成此 x86 汇编指令
- 将编译器从 x86 汇编移植到 LLVM
- 数学表达式到x86汇编Unsigned vs Unsigned
- x86汇编指令优化
- 如何在x86汇编中增加数组
- 如何在x86汇编中移动两个浮点数的结果