函数堆栈调用

环境: VS2017 

 

 

 

 


int sum(int a,int b)
{
    return a+b;
}

int main()
{
    int a = 10;
    int b = 1;
    int c = 0;
    c = sum(a,b);
    return 0;
}

 

{ (完成以下指令)

1,  push ebp
2,  mov esp,ebp
3,  sub 开辟一块内存
4, push 压入各种寄存器
5, rep stos 初始化这片内存(VS 初始化为0CCCCCCCh)

   int a = 10;
6,  mov dword ptr[a],0Ah   把0Ah放在a所在地址,VC++ 中是ebp-4是a 所在地址
    int b  = 1;
7, mov  dword ptr[b],1
    int c = 0;
8,  mov  dword ptr[ret_1],0 

    ret_1 = sum(a,b);

9, mov eax,dword ptr[b]   把b赋给eax, (把sum()中的形参变量入栈,注意,是从右往左入)
10,push eax (栈顶入栈)
11, mov  ecx,dword ptr[a]  
12, push ecx
13, call sum(0AA1082h)  call指令完成两件事,1,把下一行指令 (add esp,8)的地址入栈,2,执行跳转,跳转到sum所在的地方

14,  {(sum 的同main的一样完成1,2,3,4,5步)
 
    return a+b;
    
15 ,  mov eax,dword ptr[a]   
16,   add eax,dword ptr[b]  把b + eax   

}   
17,出栈之前压入寄存器
18,add esp,0Ch    回退形参变量内存(释放 形参所开辟的内存)
19,mov  esp,ebp
20, pop ebp
21 ret  出栈,把栈顶里的地址(下一行指令地址)赋给pc 

22,CPU 执行pc ,也就刚好是下一行指令的地址,也就回到了调用sum之后的位置


23 add esp,8
24  mov dword ptr[ret_1] eax

    return 0;
25  xor eax,eax

}执行 17,18,19,20,21
到此main函数执行结束,回到调用main函数的地方








 自己画个图会好一点,有什么问题欢迎指正。

 

 


版权声明:本文为Wqh_lrr原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。