函数调用
时间:2010-08-03 来源:xulinyu
调用函数前,会把参数入栈操作,如下面函数
void func(arg1,arg2);
push arg2
push arg1
参数入栈的顺序和编译器还有函数调用约定有关,函数调用约定请查看相关资料。这里假设入栈顺序是从右到左,因为大部分入栈顺序都是从右到左的。
参数入栈之后,会调用函数
call func
这个操作会将eip入栈,用来保证函数结束后,cpu执行call func下一个指令。
然后会将ebp入栈
push ebp
之后将ebp赋值给esp
move ebp,esp
这时ebp==esp
现在看下栈里面的内容,由于栈地址是从高到低的
所以ebp地址中保存的是以前的ebp,ebp+4保存的是eip,ebp+8保存的是arg1,ebp+12保存的是arg2
函数返回之前会将ebp恢复,esp是在函数返回之前恢复还是在函数返回之后恢复,就和调用约定有关了。
stdcall返回前是这样的ret 8,这样表示esp+8
cdecl返回前直接ret,这样esp是在函数返回后恢复esp+8。
相关阅读 更多 +