从C++探究汇编.05
补充
- mov
mov 不能左右都放内存
可以放立即数,参考官方文档 - 数组
数组名arr其实是数组的地址,也是数组首元素的地址
arr是个常量,地址
所以要用常引用:
面向对象
面向对象知识回顾
- 类
- 对象
- 成员变量、成员函数
- 封装、继承、多态
- ......
- 类
- C++中可以用struct、class 关键字定义类
struct默认成员权限是public
class 默认成员权限是private
利用类创建对象
Person person;
person.age = 10;
person.run();
getchar();
return 0;
利用指针
Person *p = &person;
指针访问对象的成员变量
p->m_age = 40;
p->run();
对比:
在内存中的布局:
- 上面代码中person对象、p指针的内存都是在函数的栈空间,自动分配和回收的
反汇编struct和class,看看是否有其他区别
struct
class
image.png
-
函数
类里面定义的函数不占内存吗?
函数在内存中只有一份 call 函数地址
对象的变量不是
对象的内存布局:
-
如果类中有多个成员变量,对象的内存又是如何布局的?
person对象的内存在栈空间
-
this
函数式同一个地址,为什么调用run打印不同?
run 函数在代码区,对象在栈空间
作出假设:
但是这样太麻烦
编译器有个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不一样
对象调 会将 对象 地址传进去
硬件中断
什么是CC?
int3: 起到断点的作用
假设 jmp jz 地址 不小心指向了不对的栈空间 就会断点
display 汇编: