c++类反汇编
c++ class disassembly
我有以下代码:
class Base {
public:
int x,y;
Base() { x=10; y=20; }
virtual void myfunction() { }
};
int main() {
Base *b = new Base();
return 0;
}
拆解给了我类似的东西:
push 0Ch ; size of Base
call j_<some giberrish> ; IDA gives the comment "operator new(uint)"
add esp, 4 ; function epilogue
mov [ebp+var_E0], eax
几行之后,将调用构造函数。
mov ecx, [ebp+var_E0]
call j_Base__Base
mov [ebp+var_F4], eax
- 起初,我认为
var_E0
会包含指向实例的指针,但现在我非常确信var_F4
会包含构造函数的返回值 - 在这种情况下,
var_E0
包含什么?为什么在调用构造函数之前将其移动到ecx
中
它是编译器生成的临时内部变量。
编写new Base
时,编译器会生成对全局operator new
函数,然后在返回的住址显然,您的编译器保存了从operator new
存储在内存中,而不是将其保存在寄存器中。
Visual C++使用内部约定,其中构造函数返回指向对象实例的指针(根据C++标准,构造函数没有返回值)。因此,在您的情况下,var_E0和var_F4都持有实例指针。
有关Visual C++如何实现C++的更多详细信息,请查看我的文章。
这几乎可以肯定是您正在查看的调试构建,并且调试构建的功能非常保守。创建对象需要两个阶段:分配内存,然后构造对象。编译器正在将分配的内存指针放入一个临时变量中。如果您构建了一个优化版本,则不会存储此临时变量,因为这会带来不必要的开销(写入/读取RAM)。
相关文章:
- Capstone cs_disasm仅反汇编一小部分代码
- 如何使用 objdump 反汇编 OpenJDK(bin/java)
- 在 GDB - C++ 中反汇编重载成员函数
- 尝试从 g++ 理解简单的反汇编代码
- 反汇编中的硬编码地址
- assert()函数未在反汇编中显示
- 反汇编的 exe 文件包含比源代码多得多的代码
- 分析崩溃的反汇编 C++ 代码
- 如何通过反汇编从C++函数获取"lea"指令?
- 如何在gdb中读取内存地址以进行i7处理器代码的反汇编
- arm汇编代码-理解cpp源代码的反汇编
- 研究一个简单的代码反汇编输出和内存映射
- Visual Studio Express 2010 C++反汇编调试
- 我的函数及其参数在反汇编视觉 c++ 中的名称
- 一些反汇编c++代码我很困惑
- 反汇编函数参数(无符号__int8)大海捞针[19] << 8)
- 关于反汇编输出的问题
- 编译c++代码成汇编,然后反汇编
- 反汇编器GLOBAL关键字
- 分析崩溃-翻译反汇编指令到c++等效