标签:virtual c++ pre cal 默认构造函数 font 函数 调用 nop
;17 : NVirtual nv; - - - - - - main栈开始 - - - - - -
0x401366 lea -0x10(%ebp),%eax //获取栈ebp-0x10处地址起为对象nv的首地址
0x401369 mov %eax,%ecx
0x40136b call 0x4385b4 <NVirtual::NVirtual()> //调用默认构造函数
;18 : nv.setA(3);
0x401370 lea -0x10(%ebp),%eax //获取对象nv地址
0x401373 movl $0x3,(%esp) //传入参数一
0x40137a mov %eax,%ecx
0x40137c call 0x43859c <NVirtual::setA(int)> //调用setA函数
0x401381 sub $0x4,%esp
;19 : cout << nv.getA() << endl;
0x401384 lea -0x10(%ebp),%eax //获取对象nv地址
0x401387 mov %eax,%ecx
0x401389 call 0x438588 <NVirtual::getA()> //调用getA函数
0x40138e mov %eax,(%esp) //传入参数一
0x401391 mov $0x4c6860,%ecx //传入调用地址
0x401396 call 0x47e100 <std::ostream::operator<<(int)> //调用标准输出流
0x40139b sub $0x4,%esp //平衡栈
0x40139e movl $0x4b0de0,(%esp) //传入调用地址
0x4013a5 mov %eax,%ecx
0x4013a7 call 0x47de50 <std::ostream::operator<<(std::ostream& (*)(std::ostream&))> //调用endl
0x4013ac sub $0x4,%esp //平衡栈
;5 : class NVirtual { - - - - - - 构造函数栈开始 - - - - - -
0x4385b4 push %ebp
0x4385b5 mov %esp,%ebp
0x4385b7 sub $0x4,%esp
0x4385ba mov %ecx,-0x4(%ebp) //传入对象首地址即this指针
0x4385bd mov $0x4c1450,%edx //传入虚表首地址,它的值即为函数地址!!!
0x4385c2 mov -0x4(%ebp),%eax
0x4385c5 mov %edx,(%eax) //this指针的值即为虚表首地址
0x4385c7 nop
0x4385c8 leave
0x4385c9 ret
;10 : virtual void setA(int a) { - - - - - - setA函数栈开始 - - - - - -
0x43859c push %ebp
0x43859d mov %esp,%ebp
0x43859f sub $0x4,%esp
0x4385a2 mov %ecx,-0x4(%ebp)
;11 : this->a = a;
0x4385a5 mov -0x4(%ebp),%eax //传入对象首地址
0x4385a8 mov 0x8(%ebp),%edx //传入形参一数值
0x4385ab mov %edx,0x4(%eax) //传到对象第二个位置(每个位置4字节)
;12 : }
0x4385ae nop
0x4385af leave
0x4385b0 ret $0x4
;7 : virtual int getA() { - - - - - - getA函数栈开始 - - - - - -
0x438588 push %ebp
0x438589 mov %esp,%ebp
0x43858b sub $0x4,%esp
0x43858e mov %ecx,-0x4(%ebp)
;8 : return a;
0x438591 mov -0x4(%ebp),%eax //传入对象首地址
0x438594 mov 0x4(%eax),%eax //取出对象第二个位置值
;9 : }
0x438597 leave
0x438598 ret
标签:virtual c++ pre cal 默认构造函数 font 函数 调用 nop
原文地址:https://www.cnblogs.com/reverse201/p/10359564.html