天天看点

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

#include<stdio.h>
#include<windows.h>
int myadd (int x,int y)
{
    int z = x + y;
    return z;
}
int main()
{
    int a = ;
    int b = ;
    int c = myadd(a,b);
    printf("you should run here!\n");
    printf("result:%d\n",c);
    system("pause");
    return ;
}
           

最初的栈结构

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

定义a,b

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

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

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

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

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

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

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

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

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

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

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

形成一个新空间myadd函数的栈帧

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

将[ebp+8]加上[ebp+0ch]放入eax,再把eax放入[ebp-4]

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

mov esp,ebp

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

将ebp弹出

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

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

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

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

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

继续阅读