青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天下

記錄修行的印記

函數調用、調用約定和名字約定

函數調用、調用約定和名字約定

調用約定:
__cdecl __fastcall與 __stdcall,三者都是調用約定(Calling convention),它決定以下內容:
1)函數參數的壓棧順序,
2)由調用者還是被調用者把參數彈出棧
3)以及產生函數修飾名的方法
    
__cdecl
__cdecl調用約定又稱為C調用約定,是 C
/C++ 語言缺省的調用約定。參數按照從右至左的方式入棧,函數本身不清理棧,此工作由調用者負責,返回值在EAX中。
對于 C,__cdecl 命名約定使用前面帶下劃線 (_) 的函數名;不執行任何大小寫轉換。對于C
++,除非聲明為 extern "C",否則 C++ 函數將使用不同的名稱修飾方案。    


__stdcall 
__stdcall調用約定參數按照從右至左的方式入棧,函數自身清理堆棧,返回值在EAX中。    
對于 C,__stdcall 命名約定使用前面帶下劃線 (_) 的函數名,后跟“at”符 (@) 和函數的參數大小(以字節為單位)。不執行任何大小寫轉換。編譯器使用下列命名約定模板:
_functionname@number

__fastcall
顧名思義,__fastcall 的特點就是快,因為它通過 CPU 寄存器來傳遞參數。他用 ECX 和 EDX 傳送前兩個雙字(DWORD)或更小的參數,剩下的參數按照從右至左的方式入棧,函數自身清理堆棧,返回值在 EAX 中。

__thiscall
這是 C
++ 語言特有的一種調用方式,用于類成員函數的調用約定。如果參數確定,this 指針存放于 ECX 寄存器,函數自身清理堆棧;如果參數不確定,this指針在所有參數入棧后再入棧,調用者清理棧。__thiscall 不是關鍵字,程序員不能使用。參數按照從右至左的方式入棧。

名字修飾約定:
1、修飾名(Decoration name):"C"或者"C++"函數在內部(編譯和鏈接)通過修飾名識別
2、C編譯時函數名修飾約定規則:
__stdcall調用約定在輸出函數名前加上一個下劃線前綴,后面加上一個
"@"符號和其參數的字節數,格式為_functionname@number,例如:function(int a, int b),其修飾名為:_function@8
__cdecl調用約定僅在輸出函數名前加上一個下劃線前綴,格式為_functionname。
__fastcall調用約定在輸出函數名前加上一個
"@"符號,后面也是一個"@"符號和其參數的字節數,格式為@functionname@number。

3、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++調用.



堆棧    
棧:棧是向低地址擴展的數據結構,是一塊連續的內存的區域。
棧又稱堆棧,是用戶存放程序臨時創建的局部變量,也就是函數括弧“{}”中定義的變量(但不包括static聲明的變量,)。除此以外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,并且待到調用結束后,函數的返回值也會被存放回棧中。由于棧的先進后出特點,所以棧特別方便用來保存
/恢復調用現場。從這個意義上,可以把堆棧看成一個寄存、交換臨時數據的內存區。  
  
棧空間都是在運行時動態的分配的。
函數堆棧在運行時動態分配,原因有二:
一、無法在編譯時候確定函數運行時所需的堆棧大小;
二、節省空間

函數名就是一個指針,指向函數入口地址,也就是一個代碼段的地址。
在內存中,數據和指令,堆棧分別在不同的地址段,數據段存儲的是程序的數據,代碼段存儲的是程序的指令,棧段是函數調用是保存參數和調用是上下文數據的內存區。棧由系統自動分配.

函數名就指向一個代碼段的地址。對數據段的內存地址進行復引用操作(
*a),得到內存中數據的值。如果對一個代碼段內存地址進行復引用操作,沒用什么實際意義,不可能返回一個指令。

在標準c文檔(WG14 N1124)里這樣描述 
A function designator 
is an expression that has function type. Except when it is the
operand of the 
sizeof operator or the unary & operator, a function designator with
type 
"function returning type" is converted to an expression that has type "pointer to
function returning type".

也就是說函數類型表達式(如
*pf)會被自動轉化成函數指針. 這樣你加多少個*都沒有關系. 

另外對一個函數指針pf, (
*pf)() 和 pf() 都已成為合法的用法 (k&R 不支持 pf())。

C99 的文檔里也提到這一點:

Pointers to functions may be used either 
as (*pf)() or as pf(). The latter construct, not
sanctioned 
in K&R, appears in some present versions of C, is unambiguous, invalidates no old
code, and can be an important shorthand. The shorthand 
is useful for packages that present only
one external name, which designates a structure full of pointers to objects and functions: member
functions can be called 
as graphics.open(file) instead of
(
*graphics.open)(file).

說的是這樣子可以方便調用結構里的函數。
   

posted on 2011-10-24 17:36 天下 閱讀(618) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

導航

統計

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产精品va在线观看| 欧美日韩综合一区| 亚洲精品一区二区在线| 久久久久国产精品www| 欧美一区二区高清| 亚洲在线播放电影| 亚洲女与黑人做爰| 久久精品国内一区二区三区| 午夜激情综合网| 久久精品国产一区二区三区免费看 | 久久精品中文字幕免费mv| 欧美亚洲在线| 久久一区亚洲| 欧美色欧美亚洲高清在线视频| 欧美日本高清| 国产亚洲精品福利| 国产亚洲欧美日韩日本| 亚洲黄网站在线观看| 在线一区二区视频| 美女91精品| 宅男精品视频| 美日韩精品视频免费看| 亚洲激情小视频| 亚洲永久网站| 亚洲高清在线精品| 亚洲经典自拍| 久久精品一二三区| 六月天综合网| 亚洲一区综合| 欧美 日韩 国产在线| 国产精品高潮粉嫩av| 亚洲国产精品va在看黑人| 亚洲欧美怡红院| 亚洲片在线观看| 久久精品女人天堂| 国产精品久久福利| 日韩一级在线| 欧美成人免费全部观看天天性色| 夜夜嗨一区二区| 欧美韩国日本一区| 亚洲国产福利在线| 久久综合九色综合久99| 亚洲欧美日韩在线观看a三区| 欧美日韩播放| aⅴ色国产欧美| 欧美激情在线播放| 久久久精彩视频| 韩国免费一区| 久久久水蜜桃| 欧美在线啊v一区| 国产欧美日韩高清| 欧美一区1区三区3区公司| 日韩天堂av| 欧美日韩一区二区在线视频| 99国产精品视频免费观看| 亚洲国产精品久久久| 快播亚洲色图| 亚洲激情视频在线| 亚洲欧洲日韩在线| 欧美日韩国产限制| 亚洲一区二区三区乱码aⅴ| 欧美激情bt| 99av国产精品欲麻豆| 亚洲经典视频在线观看| 欧美日韩第一区日日骚| 在线午夜精品| 亚洲欧美国产日韩天堂区| 国产精品一区二区你懂得| 香蕉成人久久| 久久精品国产亚洲高清剧情介绍| 国产亚洲一级高清| 欧美v亚洲v综合ⅴ国产v| 免费观看不卡av| 99在线|亚洲一区二区| 99精品欧美一区二区三区综合在线| 欧美岛国在线观看| 一区二区高清| 亚洲欧美日韩第一区| 国产一区二区三区四区在线观看| 久久久中精品2020中文| 久久精品视频免费| 亚洲日韩欧美视频| 中日韩在线视频| 国产一区二区精品久久| 久热国产精品| 欧美精品免费播放| 欧美影院在线播放| 久久天堂av综合合色| 裸体女人亚洲精品一区| 99re6这里只有精品| 一区二区三区 在线观看视频| 国产喷白浆一区二区三区| 久久精品视频在线观看| 猫咪成人在线观看| 亚洲一区在线播放| 久久九九电影| 亚洲视屏在线播放| 久久久中精品2020中文| 国产一区二区剧情av在线| 国产精品jizz在线观看美国| 最新精品在线| 欧美成人精品在线| 99精品国产一区二区青青牛奶| 亚洲欧美中文另类| 99国产一区| 亚洲第一区在线| 欧美刺激性大交免费视频 | 欧美日韩亚洲高清一区二区| 欧美亚洲自偷自偷| 欧美精品在线极品| 欧美v国产在线一区二区三区| 国产九区一区在线| 亚洲毛片网站| 亚洲国产日韩欧美| 久久久99免费视频| 宅男噜噜噜66一区二区66| 久久久精品999| 欧美中在线观看| 欧美午夜www高清视频| 亚洲国产精品一区二区www| 激情视频一区二区三区| 亚洲欧美日韩国产综合在线| 亚洲午夜在线观看| 午夜精品视频| 美女被久久久| 欧美日韩情趣电影| 欧美成人免费全部观看天天性色| 亚洲视频碰碰| 久久亚洲一区二区三区四区| 亚洲大片一区二区三区| 欧美另类专区| 久久精品网址| 久久免费午夜影院| 欧美成人高清视频| 欧美天天视频| 韩日欧美一区| 一本大道久久a久久精二百| 99视频一区| 国产精品亚洲精品| 欧美视频精品在线观看| 久久人人爽人人爽| 欧美日韩成人网| 麻豆成人av| 欧美一级淫片aaaaaaa视频| 在线看无码的免费网站| 久久婷婷麻豆| 好吊妞这里只有精品| 欧美一区二区三区在线观看| 欧美伊人久久久久久久久影院| 国产精品视频免费观看| 午夜影院日韩| 噜噜噜躁狠狠躁狠狠精品视频| 尹人成人综合网| 欧美顶级大胆免费视频| 亚洲精品你懂的| 一本大道久久a久久精品综合| 欧美三级视频在线| 午夜在线观看欧美| 欧美国产日韩亚洲一区| 一卡二卡3卡四卡高清精品视频| 欧美色另类天堂2015| 性欧美8khd高清极品| 欧美成人一二三| 亚洲网在线观看| 韩国av一区二区三区在线观看| 欧美激情第3页| 亚洲欧美综合精品久久成人| 欧美成人午夜激情在线| 亚洲自拍偷拍福利| 在线不卡中文字幕| 欧美日韩国产系列| 久久国产精品一区二区三区| 欧美国产精品专区| 亚洲永久视频| 亚洲日本欧美| 国产酒店精品激情| 欧美国产三区| 久久九九精品99国产精品| 一区二区三区精品视频在线观看| 久久人人爽人人| 在线一区观看| 亚洲精品一区二区三区福利| 国产欧美 在线欧美| 欧美黑人一区二区三区| 欧美主播一区二区三区| 一区二区毛片| 亚洲二区在线视频| 久久久久国产成人精品亚洲午夜| 中文久久精品| 亚洲精品免费观看| 伊人久久综合97精品| 国产精品专区一| 国产精品ⅴa在线观看h| 欧美ed2k| 久久久亚洲午夜电影| 亚洲午夜日本在线观看| 最新成人av网站| 亚洲国产精品一区二区久| 欧美中文字幕在线播放| 午夜精品福利电影|