2011-03-25 68 views
1

我想知道在從頭到尾使用gcc for x86平臺編譯的C程序中的函數調用需要多少指令。C中的函數調用需要多少條機器指令?

+6

gcc -g test.c,gdb a.out,disas main – Erik 2011-03-25 16:06:08

+1

建立通話的指令有多少?事後設置和清理(根據調用約定,可能發生在調用者或被調用者中)?無論如何,確切數量取決於傳遞的參數數量。 – Jon 2011-03-25 16:06:46

+1

@Erik你錯過了計數指令的一步! ;-) – 2011-03-25 16:07:15

回答

1

這是一個非常棘手的問題,這是很難回答,它可能會有所不同。

首先在呼叫者需要傳遞參數,具體取決於類型會有所不同,在大多數情況下,您將有一個指令爲每個參數。

然後,在被調用的過程中,第一條指令將爲局部變量進行分配。這通常在3個操作中完成:

PUSH EBP 
MOV EBP, ESP 
SUB ESP, xxx 

之後您將擁有函數的彙編代碼。

下面的代碼,但迴歸前,EBP和ESP將恢復:

MOV ESP, EBP 
POP EBP 

最後,你將有一個RET指令取決於調用約定將dealocate堆棧的參數或者它會將其留給呼叫者。如果RET分別以數字作爲參數或者參數爲0,則可以確定這一點。在參數爲0的情況下,您將在CALL指令後在呼叫者處有POP指令。

+0

誰對參數有任何說明? :-) – 2011-03-25 18:23:12

3
  • 寫一些代碼。
  • 編譯它。
  • 看看反彙編。
  • 計算說明。

答案會有所不同,你改變參數的數量和類型,調用約定等

1

我希望至少一個

CALL Function 

,除非它是內聯的,當然。

1

如果(在64位或-mpreferred-stack-boundary=2,或3)使用-mno-accumulate-outgoing-args-Os,然後將塔頂的是恰好一個push每參數字大小參數,一個call,和一個add返回後調整堆棧指針。

沒有-mno-accumulate-outgoing-args和默認的16字節堆棧對齊方式,gcc生成的代碼速度大致相同,但函數調用的速度大概是5倍,因爲沒有任何理由。