描述函数栈帧的调用过程
来源:互联网 发布:特朗普的对华政策 知乎 编辑:程序博客网 时间:2024/06/16 04:18
这次我们通过例子来研究调用过程:
int sum(int a,int b){ int temp = 0; temp = a+b; return temp;}int main(){ int a = 10; int b = 20; int ret = sum(a,b); return 0;}
CPU含有两个寄存器:eax,edx
返回值字节:
1. <=4 用eax返回
2. 4-8 用eax和edx返回
3. >8 用临时量返回
1、我们先运行主函数,那么就有主函数的栈:
main函数的栈开辟出来为黑色区域,设定栈底指针ebp指向0x100
①在栈底压栈a,压栈b。
②在调用sum时需要在栈顶压栈sum的形参,压栈从右向左压栈。
③压完形参后需要记录现在运行到哪一步指令的信息,于是在栈底压入call下一行指令的地址。
2、这时就进入了sum函数的栈红色区域:
①在进入时需要保存调用sum函数的函数地址在,于是将main函数的ebp压栈,即sum函数的栈底保存0x100。
②这时要给sum栈开辟大小,调整esp和ebp的位置,将ebp指向sum函数的栈底。
③将esp减去4ch,表示开出4ch大小的函数空间。
④将开出的空间初始化,变为0xcccccccc。
①②③④是sum函数中的: {
⑤现在可以运行sum函数的代码,将temp压栈,并将其赋值为0.
⑥要运算 temp = a + b;需要将a的形参值放到寄存器eax中,ebp+8就指向形参a。
⑦ebp+12指向形参b,将形参b带去eax中然后让a和b相加。4
⑧将加的值通过eax带出给temp。
⑨运行return temp,由于temp为四字节,所以通过eax返回,所以讲temp的值放入寄存器eax中,然后返回。
⑤⑥⑦⑧⑨为sum中的代码时的步骤
sum return之后:
⑩释放掉sum函数的内存,即移动ebp和esp,让ebp = esp。
1.这时要回到main函数中,于是pop ebp,找到主函数的地址,回到了主函数,继续pop ebp找到下一行指令地址,将下一行指令地址存到寄存器中。
2.回到了int ret = sum(a,b);中,将返回值eax复制给ret,雨水栈帧结束。
- 描述函数栈帧的调用过程
- 函数栈帧的调用过程
- 函数调用过程的栈帧
- 函数调用的过程-栈
- 函数调用的过程
- 函数调用的过程
- 函数调用的过程
- 函数的调用过程
- 函数的调用过程
- 函数栈帧(函数调用过程详解)
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁。
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程、栈帧的创建以及销毁
- 函数的调用过程,栈帧的创建和销毁。
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建与销毁
- Ajax 求大神帮忙!
- Effect(九)—— OnlySoundEffect
- redis持久化那些事(kēng)
- CAESARII 5.1 无限使用功能\
- PhpMyAdmin 配置文件现在需要一个短语密码的解决方法
- 描述函数栈帧的调用过程
- 贝叶斯规则
- c 程序 自己学习的一些出错点
- 【组合数】51Nod 1627 瞬间移动
- C++:补齐函数编写递归函数计算x的y次幂(hhhh函数 !头疼!)
- 什么是JVM、Java编译器和Java解释器
- idea 激活
- JAVA 记录小组信息输出
- Java导入Excel中的数据,及一些Excel的逻辑判断