以上是帧指针的示意图:下面是函数调用的示意图
字节差取决于程序位数,32位为4,64位为8
push ebp
mov ebp,esp //接下来开辟栈空间,和保存寄存器值,后者赋值前者
i386函数的标准进入和退出指令序列
push ebp
mov ebp,esp
sub esp,x //开辟栈空间,x个字节数
push [reg1]
。。。。
push [regn]//保存必要参数
。。。。。。。//函数的实际内容
pop [regn]
。。。。
pop[reg1]
mov esp,ebp
pop ebp //两句经常用leave指令代替
ret //取ebp之下的ret_address 返回(强调:这里指中整个函数结束后,如果此值被修改,只会在函数运行到ret是起作用,如'aaaa'则可能之前函数流程就被挟持,在之前就已经得到flag,之后返回不返回main意义不大)