1.當在函式外面時,已經執行到該函式位置(還沒呼叫),觀察當前棧中記憶體情況,記下當前棧頂位置
如上,當前esp為ebp-78
然後f8直接呼叫並跳過函式,再觀察棧頂位置
可以看到esp變為ebp-70(這個就是壓參前的esp位置)
由此,我們可以推斷7400a294位址處的函式有2個引數,並且能夠知道該函式採用的是stdcall呼叫約定
該函式內部在返回的時候將esp+8,使esp恢復到呼叫函式前(應該說是壓入引數前)的位置
可以看到最後函式返回指令為:retn 8,正確
2.如果說已經進入了該函式,該怎麼判斷引數個數呢?
其實同上面類似,就是需要往前推一點,找到呼叫該函式的地方,然後按1中的方法即可
那麼如何找到呼叫該函式的地方?
現在假如進入了某個函式(記住,這裡必須是剛進入函式的時候,因為函式裡面可能有區域性變數或者函式裡面的函式的引數被壓入棧,從而影響esp的位置),我們可以看棧中記憶體,當前esp指向了該函式的返回位址,
圖中函式返回位址為7400a21f
轉到7400a21f
引數個數可變的函式
今天突然想起引數個數可變的函式,然後想了下,覺得自己還真不太了解它,遂決定弄清楚。1.如何取得可變引數 比如 void f int fixpara1,char p char fixpara1 取得固定引數位址 cout int p 為什麼p 4可以取到第乙個可變引數呢?因為引數在函式被呼叫前,會逐個...
可變引數個數的函式
type vafunction type arg1,type arg2,引數可以分為兩部分 個數確定的固定引數和個數可變的可選引數。函式至少需要乙個固定引數,固定引數的宣告和普通函式一樣 可選引數由於個數不確定,宣告時用 表示。固定引數和可選引數公同構成乙個函式的引數列表。標準c c 包含標頭檔案s...
傳入引數個數 main函式引數的秘密
大家應該都有乙個模糊的記憶,c語言中main函式是程式的入口函式,所以程式執行時main函式呼叫別的函式,並且給別的函式傳入引數。但是沒人告訴我們是誰 呼叫 的main函式。其實我們可以理解為是作業系統呼叫的main函式,所以main函式的引數應該是作業系統給的,也就是說我們的在命令列介面執行程式是...