函数调用过程: 通过 call 指令跳转到函数首地址处,执行函数内的指令代码,既然是地址,当然就可以使用指针变量进行存储。
用于保存函数首地址的指针变量被称为函数指针。函数指针的定义:
函数指针的类型由返回值,参数信息、调用约定组成,它们决定了函数指针在函数调用过程中参数的传递、返回值信息以及如何平衡栈顶。
6 void _cdecl Show() {
7 printf("Show \r\n");
8 }
9 int _stdcall ShowParam(int nShow) {
11 return nShow;
12 }
14 int main()
15 {
17 void(_cdecl *pShow)(void) = Show;
mov dword ptr ss:[ebp-8],functionpointer.36134D 函数名即为函数首地址,常量
18 pShow();
mov esi,esp
call dword ptr ss:[ebp-8] 获取指针变量地址,间接调用
19 Show();
call functionpointer.36134D 直接调用函数
21 int (_stdcall *pShowParam)(int) = ShowParam;
mov dword ptr ss:[ebp-14],functionpointer.36121C
22 int nRt = pShowParam(5);
mov esi,esp
push 5
call dword ptr ss:[ebp-14]
23 printf("pShowParam %d\r\n", nRt);
mov eax,dword ptr ss:[ebp-20]
push eax
push functionpointer.367B3C
call functionpointer.36132F
25 return 0;
26}