从C++探究汇编.05

2021-11-03  本文已影响0人  Stago

补充

数组名arr其实是数组的地址,也是数组首元素的地址

arr是个常量,地址

所以要用常引用:

面向对象

面向对象知识回顾

  • 对象
  • 成员变量、成员函数
  • 封装、继承、多态
  • ......

struct默认成员权限是public
class 默认成员权限是private

利用类创建对象

Person person;
person.age = 10;
person.run();

getchar();
return 0;

利用指针

Person *p = &person;

指针访问对象的成员变量

p->m_age = 40;
p->run();

对比:

在内存中的布局:

反汇编struct和class,看看是否有其他区别
struct


class



image.png

类里面定义的函数不占内存吗?

函数在内存中只有一份 call 函数地址
对象的变量不是

对象的内存布局:

作出假设:


但是这样太麻烦
编译器有个this指针,会把当前对象传给函数的this
this指针存储着函数调用者的地址
this指向了函数调用者

怎么实现的?
比一般的函数多个lea,将person1的地址值赋值给了ecx


进入函数内部代码:


拿出关键代码分析:
ebp-8是this指针的地址


eax是person1的地址


梳理一遍流程:



思考:
可以利用this.m_age来访问成员变量么?

不可以,因为this是指针,必须用this->m_age

如果有多个成员变量




通过指针调用:


分析:



10,40,50
eax 是age的地址值 (不是person)
eax == &person.m_age == &person + 4


思考如果将person.display()换乘p->display()?


分析:
传入的this不一样
对象调 会将 对象 地址传进去

指针调 会将 p 存储的地址 传递给函数

硬件中断
什么是CC?
int3: 起到断点的作用
假设 jmp jz 地址 不小心指向了不对的栈空间 就会断点

display 汇编:


上一篇下一篇

猜你喜欢

热点阅读