x86 x64調用約定及傳參順序


 

x86平台下的調用約定

_cdecl __fastcall與 __stdcall,三者都是調用約定(Calling convention),它決定以下內容:
1)函數參數的壓棧順序
2)由調用者還是被調用者把參數彈出棧
3)以及產生函數修飾名的方法。
 
1、 __stdcall調用約定:
__stdcall是 Windows API默認調用約定,微軟的WINAPI、CALLBACK等宏都是這個調用約定
函數的參數自 右向左通過棧傳遞, 被調用的函數在返回前 清理傳送參數的內存棧,
2、 __cdecl
 
__cdecl是 C/C++的默認調用約定,如果不顯示聲明調用約定的情況下,就是該調用約定。
函數的參數自 右向左通過棧傳遞,每一個 調用它的函數都包含 清理堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。
注意:對於可變參數的成員函數,始終使用__cdecl的轉換方式。
3、 __fastcall調用約定:它是通過 自右向左 寄存器傳參(實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數, 剩下的參數仍舊 自右向左壓棧傳送, 被調用的函數在返回前 清理傳送參數的內存棧)。

x64平台下的調用約定

 x64平台取消了上文的_cdecl __fastcall __stdcall這些調用約定。而傳參是寄存器和棧相結合實現。

優先寄存器傳參. 前4個參數分別是 rcx rdx r8 r9進行傳參.多余的通過棧傳參.從右向左入棧.

參考:https://www.cnblogs.com/iBinary/p/10959444.html

函數傳參順序

32位函數入棧傳參
從右到左依次入棧
64位函數寄存器傳參
前四個參數從左到右依次入寄存器:rdx, rcx, r8, r9, 后面的依次從 右向左 入棧(和32位匯編一樣)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM