函数调用的具体过程以及栈帧的创建和销毁
2017-11-03 19:21
363 查看
这里用一个简单的Add加法程序讲解函数调用过程
先从主函数部分开始。
首先创建mainCRTStartup函数的栈帧。
esp栈顶指针减0E4(228),开辟了228字节大小空间。
接着又压入3个寄存器ebx、esi、edi
然后用下面代码把开辟的空间初始化为cc cc cc cc
接下来就是创建局部变量a,b,ret并赋值。
然后便开始传参
call调用Add函数,并且调用前保存了call指定的下一条指定的地址。
main函数
》
开始Add部分
刚开始也是一样为Add函数创建栈帧
接着创建z变量,赋值为0
把x放到eax中
把y也加到eax中
把eax放到z里面
Add到这就差不多结束了,开始return z,z放到eax里,把寄存器变量传回去;
pop出栈
Add函数
#include <stdio.h> #include <windows.h> #include <assert.h> int Add(int x, int y) { int z = 0; z = x + y; return z; } int main() { int a = 1; int b = 2; int ret = 0; ret = Add(a, b); system("pause"); return 0; }
先从主函数部分开始。
首先创建mainCRTStartup函数的栈帧。
esp栈顶指针减0E4(228),开辟了228字节大小空间。
接着又压入3个寄存器ebx、esi、edi
然后用下面代码把开辟的空间初始化为cc cc cc cc
接下来就是创建局部变量a,b,ret并赋值。
然后便开始传参
call调用Add函数,并且调用前保存了call指定的下一条指定的地址。
main函数
》
开始Add部分
刚开始也是一样为Add函数创建栈帧
接着创建z变量,赋值为0
把x放到eax中
把y也加到eax中
把eax放到z里面
Add到这就差不多结束了,开始return z,z放到eax里,把寄存器变量传回去;
pop出栈
Add函数
相关文章推荐
- 函数的调用过程、栈帧的创建以及销毁
- 浅谈函数的调用过程,栈帧的创建以及销毁
- 函数调用过程,栈帧的创建和销毁
- 函数的调用过程 栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁。
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁。
- 谈谈函数的调用过程,栈帧的创建和销毁。
- 【C】函数的调用过程,栈帧的创建和销毁
- 函数的调用过程(栈帧的创建和销毁)
- 浅谈函数的调用过程,栈帧的创建和销毁,附图讲解
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建和销毁
- 函数的调用过程,栈帧的创建与销毁
- 谈谈函数的调用过程,栈帧的创建和销毁。
- 函数调用过程,栈帧的创建和销毁
- MFC应用程序消息处理及其窗口创建和销毁过程函数调用顺序
- 函数的调用过程,栈桢的创建和销毁。
- 函数的调用过程(函数调用栈帧的创建)