亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

函數調用,__stdcall,__cdecl,__fastcall,thiscall,naked call,__pascal

2019-11-17 05:22:17
字體:
來源:轉載
供稿:網友

  左通過棧傳遞,被調用的函數在返回前清理傳送參數的內存棧,但不同的是函數名的修飾部分(關于函數名的修飾部分在后面將具體說明)。

_stdcall是Pascal程序的缺省調用方式,通常用于Win32 Api中,函數采用從右到左的壓棧方式,自己在退出時清空堆棧。VC將函數編譯后會在函數名前面加上下劃線前綴,在函數名后加上"@"和參數的字節數。

2、C調用約定(即用__cdecl要害字說明)按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對于傳送參數的內存棧是由調用者來維護的(正因為如此,實現可變參數的函數只能使用該調用約定)。另外,在函數名修飾約定方面也有所不同。

_cdecl是C和C++程序的缺省調用方式。每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函數采用從右到左的壓棧方式。VC將函數編譯后會在函數名前面加上下劃線前綴。是MFC缺省調用約定。

3、__fastcall調用約定是“人”如其名,它的主要特點就是快,因為它是通過寄存器來傳送參數的(實際上,它用ECX和EDX傳送前兩個雙字(DWord)或更小的參數,剩下的參數仍然自右向左壓棧傳送,被調用的函數在返回前清理傳送參數的內存棧),在函數名修飾約定方面,它和前兩者均不同。

_fastcall方式的函數采用寄存器傳遞參數,VC將函數編譯后會在函數名前面加上"@"前綴,在函數名后加上"@"和參數的字節數。

4、thiscall僅僅應用于“C++”成員函數。this指針存放于CX寄存器,參數從右到左壓。thiscall不是要害詞,因此不能被程序員指定。

5、naked call采用1-4的調用約定時,假如必要的話,進入函數時編譯器會產生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數時則產生代碼恢復這些寄存器的內容。naked call不產生這樣的代碼。naked call不是類型修飾符,故必須和_declspec共同使用。

要害字 __stdcall、__cdecl和__fastcall可以直接加在要輸出的函數前,也可以在編譯環境的Setting.../C/C++ /Code Generation項選擇。當加在輸出函數前的要害字與編譯環境中的選擇不同時,直接加在輸出函數前的要害字有效。它們對應的命令行參數分別為/Gz、/Gd和/Gr。缺省狀態為/Gd,即__cdecl。

要完全模擬PASCAL調用約定首先必須使用__stdcall調用約定,至于函數名修飾約定,可以通過其它方法模擬。還有一個值得一提的是WINAPI宏,Windows.h支持該宏,它可以將出函數翻譯成適當的調用約定,在WIN32中,它被定義為__stdcall。使用WINAPI宏可以創建自己的APIs。

2)名字修飾約定

1、修飾名(Decoration name)

“C”或者“C++”函數在內部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數定義或者原型時生成的字符串。有些情況下使用函數的修飾名是必要的,如在模塊定義文件里頭指定輸出“C++”重載函數、構造函數、析構函數,又如在匯編代碼里調用“C””或“C++”函數等。

修飾名由函數名、類名、調用約定、返回類型、參數等共同決定。

2、名字修飾約定隨調用約定和編譯種類(C或C++)的不同而變化。函數名修飾約定隨編譯種類和調用約定的不同而不同,下面分別說明。

a、C編譯時函數名修飾約定規則:

__stdcall調用約定在輸出函數名前加上一個下劃線前綴,后面加上一個“@”符號和其參數的字節數,格式為_functionname@number。

__cdecl調用約定僅在輸出函數名前加上一個下劃線前綴,格式為_functionname。

__fastcall調用約定在輸出函數名前加上一個“@”符號,后面也是一個“@”符號和其參數的字節數,格式為@functionname@number。

它們均不改變輸出函數名中的字符大小寫,這和PASCAL調用約定不同,PASCAL約定輸出的函數名無任何修飾且全部大寫。

b、C++編譯時函數名修飾約定規則:

__stdcall調用約定:
1、以“?”標識函數名的開始,后跟函數名;
2、函數名后面以“@@YG”標識參數表的開始,后跟參數表;
3、參數表以代號表示:
X--void ,
D--char,
E--unsigned char,
F--short,
H--int,
I--unsigned int,
J--long,
K--unsigned long,
M--float,
N--double,
_N--bool,
....
PA--表示指針,后面的代號表明指針類型,假如相同類型的指針連續出現,以“0”代替,一個“0”代表一次重復;
4、參數表的第一項為該函數的返回值類型,其后依次為參數的數據類型,指針標識在其所指數據類型前;
5、參數表后以“@Z”標識整個名字的結束,假如該函數無參數,則以“Z”標識結束。

其格式為“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,例如
int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”
void Test2() -----“?Test2@@YGXXZ”

__cdecl調用約定:
規則同上面的_stdcall調用約定,只是參數表的開始標識由上面的“@@YG”變為“@@YA”。

__fastcall調用約定:
規則同上面的_stdcall調用約定,只是參數表的開始標識由上面的“@@YG”變為“@@YI”。

VC++對函數的省缺聲明是"__cedcl",將只能被C/C++調用.

CB在輸出函數聲明時使用4種修飾符號
//__cdecl
cb的默認值,它會在輸出函數名前加_,并保留此函數名不變,參數按照從右到左的順序依次傳遞給棧,也可以寫成_cdecl和cdecl形式。
//__fastcall
她修飾的函數的參數將盡肯呢感地使用寄存器來處理,其函數名前加@,參數按照從左到右的順序壓棧;
//__pascal
它說明的函數名使用Pascal格式的命名約定。這時函數名全部大寫。參數按照從左到右的順序壓棧;
//__stdcall
使用標準約定的函數名。函數名不會改變。使用__stdcall修飾時。參數按照由右到左的順序壓棧,也可以是_stdcall;


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级大胆视频| 欧美精品激情在线观看| 91精品视频专区| 亚洲综合大片69999| 萌白酱国产一区二区| 中文字幕不卡在线视频极品| 欧美日韩国产激情| 亚洲欧洲午夜一线一品| 在线精品高清中文字幕| 国内精品久久久久久久久| 日韩av中文字幕在线播放| 亚洲少妇中文在线| 亚洲欧美日韩中文在线制服| 亚洲精品短视频| 国产精品免费网站| 国产精品一区二区女厕厕| 91亚洲永久免费精品| 亚洲精品之草原avav久久| 国产丝袜精品视频| 中文字幕日本精品| 少妇高潮久久久久久潘金莲| 欧美精品久久久久久久免费观看| 亚洲韩国青草视频| 成人国产精品免费视频| 国产精品久久综合av爱欲tv| 国产精品电影在线观看| 青青a在线精品免费观看| 国产精品福利在线观看| 69**夜色精品国产69乱| 久久精品亚洲94久久精品| 国产精品三级网站| 懂色av一区二区三区| 97在线看免费观看视频在线观看| 日本午夜在线亚洲.国产| 一区二区成人av| 精品国产网站地址| 国产精品一区二区av影院萌芽| 国产精品久久久精品| 日韩视频精品在线| 国产精品6699| 国产精品成久久久久三级| 丝袜情趣国产精品| 中文字幕精品av| 精品中文字幕在线| 全球成人中文在线| 国产噜噜噜噜噜久久久久久久久| 日韩欧美成人网| 色噜噜亚洲精品中文字幕| 亚洲欧美一区二区三区在线| 亚洲欧洲国产伦综合| 永久免费毛片在线播放不卡| 亚洲欧洲成视频免费观看| 日本高清+成人网在线观看| 91精品国产高清久久久久久久久| 亚洲精品免费在线视频| 不卡av电影院| 国产精品爽爽爽爽爽爽在线观看| 欧美老女人在线视频| 中文字幕日韩专区| 日韩在线视频播放| 性日韩欧美在线视频| 国产精品丝袜久久久久久高清| 一区二区三区四区精品| 亚洲日本成人女熟在线观看| 欧美日韩成人免费| 欧美激情精品久久久久| 国产精品激情av在线播放| 欧美小视频在线观看| 久久人人爽亚洲精品天堂| 欲色天天网综合久久| 国产91在线高潮白浆在线观看| 久久九九全国免费精品观看| 91久久久久久久久久久久久| 久久久久久久影视| 欧日韩不卡在线视频| 亚洲深夜福利在线| 久久精品视频一| 欧美日韩爱爱视频| 91精品国产高清| 亚洲人成电影在线| 清纯唯美亚洲激情| 欧美在线精品免播放器视频| 色yeye香蕉凹凸一区二区av| 91在线观看免费观看| 亚洲一区www| 国产在线精品成人一区二区三区| 欧美裸体男粗大视频在线观看| 亚洲黄一区二区| 欧美亚洲激情视频| 国产成人精品a视频一区www| 色偷偷91综合久久噜噜| 国产乱肥老妇国产一区二| 久久综合亚洲社区| 日韩电影中文字幕在线| 欧美不卡视频一区发布| 538国产精品视频一区二区| 高清欧美性猛交xxxx| 伊人久久免费视频| 欧美日韩一区二区在线| 国产在线观看精品一区二区三区| 国产精品一久久香蕉国产线看观看| 国产精品吊钟奶在线| zzijzzij亚洲日本成熟少妇| 欧美最猛性xxxxx亚洲精品| 国产主播精品在线| 91极品视频在线| 亚洲aⅴ男人的天堂在线观看| 亚洲欧美激情精品一区二区| 成人xvideos免费视频| 91中文字幕一区| 高清日韩电视剧大全免费播放在线观看| 亚洲精品v欧美精品v日韩精品| 成人欧美一区二区三区黑人孕妇| 亚洲精品综合久久中文字幕| 日韩欧美成人免费视频| 国产精品户外野外| 日韩三级成人av网| 欧美亚洲免费电影| 久久精品国产一区二区三区| 成人黄色片在线| 91久久国产综合久久91精品网站| 97人人模人人爽人人喊中文字| 九九热精品视频| 亚洲国模精品私拍| 亚洲黄页网在线观看| 成人a级免费视频| 亚洲人成在线播放| 欧美一区二区大胆人体摄影专业网站| www.色综合| 久久久免费精品视频| 国产精品偷伦视频免费观看国产| 午夜精品在线视频| 亚洲欧美日韩国产中文专区| 中文字幕亚洲欧美在线| 97超碰蝌蚪网人人做人人爽| 国产精品成人在线| 国产精品久久久久国产a级| 中文字幕少妇一区二区三区| 久久不射热爱视频精品| 亚洲欧美精品在线| 久久精品视频va| 91免费在线视频| 精品久久久久久亚洲精品| 在线视频日韩精品| 亚洲性夜色噜噜噜7777| 亚州成人av在线| 久久久久久久电影一区| 成人有码视频在线播放| 亚洲有声小说3d| 国产午夜精品理论片a级探花| 国产日韩精品在线播放| 国产日韩亚洲欧美| 国产成人aa精品一区在线播放| 亚洲男女性事视频| 色婷婷亚洲mv天堂mv在影片| 国产精品av免费在线观看| 亚洲国产日韩一区| 亚洲电影在线看| 欧美精品xxx| 久久中文精品视频| 亚洲成年网站在线观看| 久久躁狠狠躁夜夜爽| 自拍偷拍亚洲欧美| 国产精品香蕉国产|