首頁 >後端開發 >C++ >不同的呼叫約定如何影響 C/C 中的函數參數傳遞和堆疊清理?

不同的呼叫約定如何影響 C/C 中的函數參數傳遞和堆疊清理?

Barbara Streisand
Barbara Streisand原創
2024-11-24 07:31:10775瀏覽

How do different calling conventions impact function argument passing and stack cleanup in C/C  ?

C/C 中的呼叫約定

在C/C 中,採用不同的呼叫約定來決定參數如何傳遞給函數以及如何傳遞返回結果。這些約定規定了參數在堆疊或暫存器中放置的順序和方法,以及堆疊清理的責任。

可用的呼叫約定

C/C提供多種呼叫約定,包括:

  • cdecl:
  • cdecl:
  • cdecl:
  • cdecl:參數從右到左壓入堆疊,並為呼叫者保存和被呼叫者保存的資料指定特定暫存器。
  • syscall: 與cdecl類似,但不保留某些暫存器且需要傳遞參數清單的大小
  • pascal: 參數從左到右壓入堆疊,被呼叫者負責堆疊平衡。
  • stdcall: pascal 的變體,其中被呼叫者處理堆疊清理,參數從右向左推送,如下所示cdecl.
  • fastcall:前兩個參數在特定暫存器中傳遞,其餘參數壓入堆疊。

vectorcall:設計使用 SIMD 暫存器有效傳遞向量參數。

safecall:

在 COM(組件物件模型)上下文中用於透明地處理異常。
  • Microsoft X64 呼叫約定:
  • Windows 上使用的標準化約定,以及x86-64 架構的預啟動UEFI,利用特定的暫存器用於參數和浮點值,並為堆疊使用“影子空間”
詳細說明有關這些呼叫約定的全面概述,請參閱以下資源:維基百科: [C呼叫約定](https://en.wikipedia.org/wiki/X86_calling_conventions)MSDN:[C 編譯器的呼叫約定](https://docs.microsoft.com/en-us/cpp /build /x64-calling-convention)英特爾:[英特爾® 64 和IA-32架構軟體開發人員手冊第1 冊:基本架構](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer -manual-325383.pdf)

以上是不同的呼叫約定如何影響 C/C 中的函數參數傳遞和堆疊清理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn