我想知道在從頭到尾使用gcc for x86平臺編譯的C程序中的函數調用需要多少指令。C中的函數調用需要多少條機器指令?
1
A
回答
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倍,因爲沒有任何理由。
相關問題
- 1. 調用一個C#函數,它需要從C#中的字符指針#
- 2. C-需要調用一個函數
- 3. Angular指令中的調用函數
- 4. Python打印語句涉及多少條計算機指令?
- 5. C++(嵌套)函數調用指令 - 寄存器
- 6. 需要調用表函數
- 7. AngularJS - 指令來指示函數調用
- 8. 從Angular中的指令調用控制器作用域函數
- 9. C++調用函數指針
- 10. 如何從控制器中的指令調用函數? AngularJS
- 11. Angular指令 - 需要從指令控制器訪問所需的控制器
- 12. 機器人 - 需要layout_attribute缺少
- 13. 來自AngularJs指令的調用函數
- 14. 指令內的角度調用函數
- 15. 調用指令內定義的函數
- 16. AS3知道有多少參數的函數需要
- 17. 有多少個參數需要Haskell的foldr函數?
- 18. 知道被調用函數完成R需要多少時間是否可行?
- 19. 函數調用的代價是多少?
- 20. 在PowerShell 2.0中需要參數的函數內調用函數
- 21. 來自父指令的角度調用指令函數
- 22. C#vb:System.Func需要多少內存?
- 23. 需要許多隨機數
- 24. C++中總是需要調用基類構造函數嗎?
- 25. 從程序集中調用c函數需要「asmlinkage」嗎?
- 26. 如何調用指向函數的指針而不需要解引用?
- 27. 調用函數指令被加載angularjs
- 28. AngularJS指令 - 初始調用函數
- 29. 調用C++函數指針從C#
- 30. 錯誤:函數'ptr'的參數太少,需要函數的eval_time
gcc -g test.c,gdb a.out,disas main – Erik 2011-03-25 16:06:08
建立通話的指令有多少?事後設置和清理(根據調用約定,可能發生在調用者或被調用者中)?無論如何,確切數量取決於傳遞的參數數量。 – Jon 2011-03-25 16:06:46
@Erik你錯過了計數指令的一步! ;-) – 2011-03-25 16:07:15