函式指標呼叫和直接函式呼叫的反彙編對比

2021-06-25 22:32:15 字數 1476 閱讀 1470

本文主要從x86彙編一級來檢視函式呼叫和函式指標呼叫函式的差別。

具體看如下的兩個函式:

void show()

void showdata(int a)

下面是兩者彙編**對比:

18: 	show();

00411aae e8 3d f6 ff ff call show (4110f0h)

19:

20: void (*ptrshow)() = show;

00411ab3 c7 45 f8 f0 10 41 00 mov dword ptr [ptrshow],offset show (4110f0h)

21: ptrshow();

00411aba 8b f4 mov esi,esp

00411abc ff 55 f8 call dword ptr [ptrshow]

00411abf 3b f4 cmp esi,esp

00411ac1 e8 84 f6 ff ff call @ilt+325(__rtc_checkesp) (41114ah)

22:

23: showdata(3);

00411ac6 6a 03 push 3

00411ac8 e8 0e f7 ff ff call showdata (4111dbh)

00411acd 83 c4 04 add esp,4

25: void (*ptrshowdata)(int a) = showdata;

00411ad0 c7 45 ec db 11 41 00 mov dword ptr [ptrshowdata],offset showdata (4111dbh)

26: ptrshowdata(3);

00411ad7 8b f4 mov esi,esp

00411ad9 6a 03 push 3

00411adb ff 55 ec call dword ptr [ptrshowdata]

00411ade 83 c4 04 add esp,4

00411ae1 3b f4 cmp esi,esp

00411ae3 e8 62 f6 ff ff call @ilt+325(__rtc_checkesp) (41114ah)

對比發現,採用函式指標的呼叫,採用間接呼叫的過程,即函式的位址首先存到乙個變數中,再通過這個變數實現對函式的呼叫。

通過函式指標呼叫函式

指標可以不但可以指向乙個整形,浮點型,字元型,字串型的變數,也可以指向相應的陣列,而且還可以指向乙個函式。乙個函式在編譯的時候會被分配給乙個入口位址。這個函式入口位址稱為函式的指標。可以用乙個指標變數指向函式,然後通過該指標變數呼叫此函式。定義指向函式的指標變數的方法是 int p int int ...

通過函式指標呼叫函式

指標可以不但可以指向乙個整形,浮點型,字元型,字串型的變數,也可以指向相應的陣列,而且還可以指向乙個函式。乙個函式在編譯的時候會被分配給乙個入口位址。這個函式入口位址稱為函式的指標。可以用乙個指標變數指向函式,然後通過該指標變數呼叫此函式。定義指向函式的指標變數的方法是 int p int int ...

使用指標呼叫函式

指向函式的指標的定義形式 資料型別 指標變數名 函式引數表列 double x,y,z scanf lf lf x,y z max x,y printf max num is lf z 以上是主函式中的內容,表示輸入x,y兩個雙精度浮點數,然後呼叫max函式求出,試執行結果如下 請輸入要比較大小的兩...