• 简单的C++程序 汇编分析


    简单的C++程序 汇编分析

    //源代码

    #include "iostream"

    using namespace std;

    class Student

    {

    private:

    int num;

    int score;

    public:

    void setdata(int p1, int p2)

    {

    int test = 0;

    num = p1;

    score = p2;

    }

    };

    int main(void)

    {

    Student S;

    S.setdata(1, 80);

    return 0;

    }

    //汇编分析

    main 函数

    堆栈:

    栈顶

    ...

    S.num← 对象S的地址 [ebp-8]

    S.score

    ebp

    ...

    栈底

    19:   int main(void)

    20:   {

    00401030   push        ebp

    00401031   mov         ebp,esp

    00401033   sub         esp,48h

    00401036   push        ebx

    00401037   push        esi

    00401038   push        edi

    00401039   lea         edi,[ebp-48h]

    0040103C   mov         ecx,12h

    00401041   mov         eax,0CCCCCCCCh

    00401046   rep stos    dword ptr [edi]

    21:       Student S;

    22:       S.setdata(1, 80);

    00401048   push        50h //压入参数80

    0040104A   push        1 //压入参数1

    0040104C   lea         ecx,[ebp-8] //S的地址放入ecx: 将this指针存入ecx中

    0040104F   call        @ILT+15(Student::setdata) (00401014)  //调用setdata函数

    23:       return 0;

    00401054   xor         eax,eax

    24:   }

    00401056   pop         edi

    00401057   pop         esi

    00401058   pop         ebx

    00401059   add         esp,48h

    0040105C   cmp         ebp,esp

    0040105E   call        __chkesp (004081a0)

    00401063   mov         esp,ebp

    00401065   pop         ebp

    00401066   ret

    //main 函数 通过 call 00401014 调用setdata函数

    @ILT+15(?setdata@Student@@QAEXHH@Z):

    00401014   jmp     Student::setdata (00401080)  //00401080 是setdata函数的入口地址

    setdata函数(ecx中存放调用该函数的对象的地址:相当于this指针)

    堆栈:

    栈顶

    ...

    test    ← test变量:ebp-8

    this指针← 通过ecx压栈: ebp-4

    ebp

    Eip     ← 返回地址:ebp+4

    p2       ← 参数p2: ebp+8

    p1      ← 参数p1: ebp+0C

    ...

    栈底

    11:       void setdata(int p1, int p2)

    12:       {

    00401080   push        ebp

    00401081   mov         ebp,esp

    00401083   sub         esp,48h

    00401086   push        ebx

    00401087   push        esi

    00401088   push        edi

    00401089   push        ecx

    0040108A   lea         edi,[ebp-48h]

    0040108D   mov         ecx,12h

    00401092   mov         eax,0CCCCCCCCh

    00401097   rep stos    dword ptr [edi]

    00401099   pop         ecx

    0040109A   mov         dword ptr [ebp-4],ecx //将this指针存入栈中

    13:           int test = 0;

    0040109D   mov         dword ptr [ebp-8],0 //test = 0;

    14:           num = p1;

    004010A4   mov         eax,dword ptr [ebp-4] //this指针eax

    004010A7   mov         ecx,dword ptr [ebp+8] //p1ecx

    004010AA   mov         dword ptr [eax],ecx //this->num = p1;

    15:           score = p2;

    004010AC   mov         edx,dword ptr [ebp-4] //this指针eax

    004010AF   mov         eax,dword ptr [ebp+0Ch]  //p2eax

    004010B2   mov         dword ptr [edx+4],eax //this->score = p2;

    16:       }

    004010B5   pop         edi

    004010B6   pop         esi

    004010B7   pop         ebx

    004010B8   mov         esp,ebp

    004010BA   pop         ebp

    004010BB   ret         8

  • 相关阅读:
    IIS Express中添加MIME
    js立即执行函数IIFE(Immediatelyinvokedfunctionexpression)的几种写法
    笑话一则
    字符串操作类 NET代码积累之一
    UrlRewriter使用详解
    压缩和解压缩的方法 from Byte[]
    C#日期格式化
    JavaScript模拟进度条
    让visual studio 2005 自动为类加版权
    godaddy免费空间完美安装部署dedecms
  • 原文地址:https://www.cnblogs.com/Conan/p/2192046.html
Copyright © 2020-2023  润新知