函数反汇编
调用过程:
1.传参:通过push指令把参数压入栈
2call指令函数地址:跳转到call的函数地址
3 push ebp 保存栈底指针
4 mov ebp,esp 提升栈底指针,和栈顶相同
5 sub esp,xxx
第3-第5步可以理解为重新给函数开辟一个栈空间
6 push 寄存器,用来保护寄存器环境,保证函数调用完之后复原
7 执行函数代码
8 返回,恢复寄存器
9 mov esp,ebp 恢复栈空间
10 恢复调用前的栈底指针 pop ebp
11 retn返回call指令的下一条指令
12 由于调用函数前push参数导致堆栈提升,所以sub后要add回来
函数调用约定
常见的有:
__cdecl c/c++中常见的三种函数调用方式
入栈顺序,从右往左,由调用的函数来删除栈空间
__stdcall windows API的函数调用方式用WINAPI的宏替代
从右往左入栈,由被调函数来删除栈空间
__fastcall 快速调用方式,将参数优先寄存器处理