从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不一样
对象调 会将 对象 地址传进去

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


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

display 汇编:


你可能感兴趣的:(从C++探究汇编.05)