美文网首页
从C++探究汇编.05

从C++探究汇编.05

作者: Stago | 来源:发表于2021-11-03 10:00 被阅读0次

    补充

    • 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

          本文链接:https://www.haomeiwen.com/subject/mspqzltx.html