函数堆栈调用

环境: 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函数的地方








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

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值