函数调用过程,栈帧的创建和销毁

来源:互联网 发布:c语言网络编程 编辑:程序博客网 时间:2024/06/05 17:04
#include<stdio.h>#include<windows.h>int myadd (int x,int y){    int z = x + y;    return z;}int main(){    int a = 0xAAAAAA;    int b = 0xBBBBBB;    int c = myadd(a,b);    printf("you should run here!\n");    printf("result:%d\n",c);    system("pause");    return 0;}

最初的栈结构
最初的栈结构

定义a,b
定义a,b

将b放在eax,将eax push入栈,esp下移
将b放在eax,将eax push入栈,esp下移

将a放在ecx,将ecx push入栈,esp下移
将a放在ecx,将ecx push入栈,esp下移

执行call命令,将当前正在执行的指令的下一条地址压入栈中
执行call命令,将当前正在执行的指令的下一条地址压入栈中

执行call指令,通过jump命令跳转到指定函数处,myadd函数的地址是00401020,则eip变为00401020
执行call指令,通过jump命令跳转到指定函数处,myadd函数的地址是00401020,则eip变为00401020

将mian函数的ebp压入栈底,mov ebp,esp
将mian函数的ebp压入栈底,mov ebp,esp

形成一个新空间myadd函数的栈帧
形成一个新空间myadd函数的栈帧
将[ebp+8]加上[ebp+0ch]放入eax,再把eax放入[ebp-4]
将[ebp+8]加上[ebp+0ch]放入eax,再把eax放入[ebp-4

mov esp,ebp
mov esp,ebp

将ebp弹出
将ebp弹出

把00401093弹入eip中,esp上移,执行main函数当前执行的指令
把00401093弹入eip中,esp上移,执行main函数当前执行的指令

add esp,8,把eax的值z放入[ebp-0ch],回到最初
add esp,8,把eax的值z放入[ebp-0ch