函數(shù)調(diào)用過(guò)程:?通過(guò) call?指令跳轉(zhuǎn)到函數(shù)首地址處,執(zhí)行函數(shù)內(nèi)的指令代碼,既然是地址,當(dāng)然就可以使用指針變量進(jìn)行存儲(chǔ)。
用于保存函數(shù)首地址的指針變量被稱為函數(shù)指針。函數(shù)指針的定義:

函數(shù)指針的類型由返回值,參數(shù)信息、調(diào)用約定組成,它們決定了函數(shù)指針在函數(shù)調(diào)用過(guò)程中參數(shù)的傳遞、返回值信息以及如何平衡棧頂。
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? ?函數(shù)名即為函數(shù)首地址,常量
18 pShow();
mov esi,esp
call dword ptr ss:[ebp-8]? 獲取指針變量地址,間接調(diào)用
19 Show();
call functionpointer.36134D? 直接調(diào)用函數(shù)
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}