理解C/C 中的呼叫約定
在C/C 中,各種呼叫約定定義了傳遞參數、回傳值和呼叫函數時清理堆疊。這些約定包括 stdcall、extern、pascal 和其他幾個。
可用的調用約定
C/C 中有許多可用的調用約定:
-
cdecl:參數從右到左壓入堆疊,堆疊平衡由呼叫者處理。
-
syscall: 與 cdecl 類似,但 EAX 、ECX 和 EDX 暫存器不會保留。
-
pascal: 參數從左到右壓入堆疊,呼叫者負責堆疊清理。
-
stdcall: 呼叫者從右向左推送參數,被呼叫者清理函數中用於特定目的的堆疊、EAX、ECX 和 EDX。
-
fastcall: 前兩個經由 ECX 和 EDX 暫存器傳遞的參數,剩餘參數從右到左壓入堆疊。
-
vectorcall: 使用 SIMD 暫存器傳遞向量參數,處理向量類型和 HVA 值。
-
safecall: 封裝 COM 錯誤處理,在 EAX 中傳遞異常,並透過堆疊上的參考傳遞結果。
-
Microsoft X64 呼叫約定:在特定暫存器中傳遞的整數參數,在 XMM 暫存器中傳遞的浮點參數,為溢位分配的影子空間。
不同約定的意思
每個呼叫約定都有它的優點和缺點。例如,stdcall 簡化了呼叫者的職責,而 fastcall 則透過減少堆疊操作來提高效能。呼叫約定的選擇可能取決於作業系統、處理器架構和編碼風格偏好等因素。
其他資源
- [維基百科:C呼叫約定](https://en.wikipedia.org/wiki/Calling_convention#C)
- [呼叫你的函數! (x86 呼叫約定)](https://www.agner.org/optimize/calling_conventions.pdf)
- [MSDN:Arm64 (AArch64) 呼叫約定](https://docs.microsoft.com / en-us/cpp/build/arm64-abi-for-visual-studio?view=vs-2022)
以上是C/C 中的不同呼叫約定如何影響函數執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!