函数的调用——栈帧
来源:互联网 发布:神庙逃亡2数据恢复 编辑:程序博客网 时间:2024/06/05 01:11
在此之前,我们贴上一段简单代码,以便研究,代码内容为求两个数之和并返回。
#include <stdio.h>
int Add(int x,int y){
int z=0;
z = x + y;
return z;
}
int main(void){
int a = 10;
int b = 20;
int ret = Add(a,b);
printf("%d",ret);
return 0;
}
当我们调用这段程序的时候,在return 0 处设置一个断点,在调试,查看调用栈帧,如下:
此时我们发现main函数在__tmainCRTStarup函数中调用,
而__tmainCRTStarup函数在mainCRTStarup中背调用。
每一次函数的调用都是一个过程,这个过程被称之为:函数的调用。
在这个过程中,要为函数开辟栈空间,用于本次调用函数中临时变量的保存以及现场的保护。这块栈空间被称作函数的栈帧。
而在开辟栈帧之后有两个寄存器我们必须了解,一个是esp,指向这个栈的栈顶,另一个是ebp,指向栈的栈底。
在开辟main函数的栈帧之后,如图:
易知,在__tmainCRTStarup函数下面的,就是mainCRTStarup函数的栈帧。
那我们在return 0;设置断点,在进行调试,查看汇编代码如下,这就是main函数栈帧的创建:
接下来可以看到主函数中Add函数传参的过程:
此时我们可以看见接收参数的时候,先去接收的b,在接收a,所以参数的接收的过程是从右向左,而不是从左向右。
以下是Add函数的执行代码的汇编
此处就不做过多详细的解释。
限于编写者水平,有诸多错误处,感谢指正!
阅读全文
0 0
- 栈帧——函数的调用过程
- 函数的调用过程——栈帧
- 函数的调用——栈帧
- *函数的调用——栈帧*
- 函数的调用过程—栈帧
- 深入理解函数的调用过程——栈帧
- Linux下的函数调用原理—栈帧
- JavaScript—函数的定义和调用
- 函数调用—sqrt函数
- 函数的调用过程--栈帧
- 函数调用原理——栈帧
- 函数调用过程——栈帧
- 函数调用方式——_stdcall与_cdecl的区别(函数调用方式)
- 利用函数指针实现动态库的动态调用——函数指针正向调用法
- C语言之函数调用10—重复函数的多次调用
- C语言之函数调用16—递归法之一般函数的调用(1)
- C语言之函数调用17—递归法之一般函数的调用(2)
- Python——调用函数
- nat inside outside
- 每天一个linux命令(1)--ls
- Node操作cookie
- [转]几张图看懂列式存储
- android开源项目集合
- 函数的调用——栈帧
- ajax 传递数组到后台
- 静态代码块和非静态代码块区别
- 【Python学习笔记(二)】:在centos上部署flask程序
- Mongodb副本集容灾
- STL之函数适配器
- 点击右键和按钮进行显示隐藏div
- 神经网络的softmax层
- Android studio 3.0.1版本出现的问题: Please select at least one of the signature versions to use