C++类反汇编

标签 c++ class assembly reverse-engineering

我有以下代码:

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 在内存中,而不是将其保存在寄存器中。

关于C++类反汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436776/

相关文章:

c++ - 无法从友元函数访问类的私有(private)成员? 'ostream' 不是 'std' 的成员?

php - 理解为什么 echo 在 php 类函数中不起作用

javascript - Typescript - 从基类调用子类的实例方法

c - Shellsort:用 C 编写 NASM 代码

linux - x86 汇编 (Linux) stdin 读取系统调用返回 1,无数据输入

c++ - cmake 中安装命令的作用是什么?

c++ - 从十进制变为二进制

c++ - 结合类模板默认参数和可变参数

optimization - 汇编语言和优化

c++ - 如何在空数组中添加用户给定的字符串并在C++中查找其长度