【C++】函数的堆栈调用过程

一、栈和栈帧的含义
在讲函数的堆栈调用之前,我们应该先了解一下栈和栈帧的含义
栈:我们都知道在虚拟地址空间上有一块栈区,它主要是给函数提供区域。也就是说栈是所有函数的活动空间。
栈帧:一个函数的活动空间
二、Linux和windows下汇编的区别

1、Linux AT&T int a = 10;
mov 0a dword ptr[a]
2、Windows inter x86
mov dword ptr[a], 0a
  

这两句的意思都是把10放到a的地址下,并且是4个字节。
三、函数堆栈下的一些指令
1、寄存器
(1)eax ebx ecx edx 这四个指令都是存储数据的.
(2)ebp:栈底指针寄存器(不会发生变化)
(3)esp:栈顶指针寄存器
(4)ip:下行指令寄存器
2、一些指令
(1)mov:移植指令
(2) lea:移地址指令
(3)push:压栈
push 0a;(数值入栈,esp-=4;)
(4)pop:出栈
pop eax;(eax = pop)
(5)add:加等指令
add eax, 10;(eax+=10;)
(6)sub:减等指令
sub eax, 10;(eax-=10;)
四、函数的堆栈调用过程
1、函数的调用过程:
(1)栈帧的开辟
(2)压实参:给形参开辟内存,并赋值
(3)压下一行指令地址
(4)压旧的ebp 用图简单表示为:
2、下面我们通过一个简单的例子来说明它的过程。
先给出代码:

#include <stdio.h>
int Sum(int left,int right)
{
 int tmp = 0;
 tmp = left + right;
 return tmp;
}
int main()
{
 int a = 10;
 int b = 20;
 int rt = 0;
 rt = Sum(a,b);
 printf("a:%d\nb:%d\n",a,b);
 return 0;
}

由上面的代码我们可以看出有一个main函数和一个sum函数,我们给出这两个函数的反汇编过程。
main函数:
在这里插入图片描述
在这里插入图片描述
我可以简单得画出栈中的整个过程:
在这里插入图片描述
上图中的esp1到esp9分别为esp的移动过程,ebp1到ebp2位ebp的移动过程
整个函数的调用,结合上面两图就可以清晰得看出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值