函数反汇编

调用过程:

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 快速调用方式,将参数优先寄存器处理